Introduction

Prioritisation can largely be broken into two steps – geographic prioritisation and beneficiary selection.

This document examines data from the FAO-WFP Shocks, Agricultural Livelihoods and Food Security Survey, the Armed Conflict Location and Event Dataset (ACLED) and the Myanmar Information Management Unit (MIMU).

The first section deals with the development of a beneficiary profile using the FAO-WFP survey data to inform beneficiary selection. The second section makes use of ACLED data for Myanmar to develop a conflict score for township prioritisation. Township and beneficiary selection criteria are linked by a decision tree. The third section presents flood risks by township – these are only probabilities and serve as references for prepositioning and disaster risk reduction. They not included in the overall prioritisation process, though this might change if disasters occur. This document is closed by a section on technical notes.


References for this report

  • ACLED (2022). ACLED data for Myanmar (2010-2022). https://acleddata.com.
  • Maria Noel Pi Alperin, Philippe Van Kerm (2009). mdepriv: Synthetic indicators of multiple deprivation. Stata command. http://medim.ceps.lu/stata/mdepriv_v3.pdf
  • Atillio Benini, Aldo Benini (2021). mdepriv: Synthetic scores of multiple deprivation. R package version 0.0.3. https://github.com/a-benini/mdepriv/.
  • Gianni Betti, Vijay Verma (2004). A methodology for the study of multi-dimensional and longitudinal aspects of poverty and deprivation. Dipartamento di Metodi Quantitativi, Universita di Siena. http://repec.deps.unisi.it/quaderni/49DMQ.pdf.
  • FAO and WFP (2022). Myanmar | Shocks, agricultural livelihoods and food security: Monitoring report, March 2022. Rome.
  • Food Security Cluster, Myanmar (2021). 5Ws reporting tool.
  • Food Security Cluster, Myanmar (2022). Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. https://food-security-cluster-myanmar.github.io/exploratory-data-analysis-acled-fsc/.
  • HARP-F and MIMU (2018). Vulnerability in Myanmar: A Secondary Data Review of Needs, Coverage and Gaps. http://themimu.info/vulnerability-in-myanmar.
  • IFPRI (2022). Household Welfare in Myanmar: Results from the Myanmar Household Welfare Survey.
  • MIMU (2022). Climate, Environmental Degradation and Disaster Risk in Myanmar.
  • UNHCR (2022). Pre and Post 1 Feb 2021 IDPs Population by Township level.
  • WFP Nigeria Country Office (2018). Standard Operating Procedure: Beneficiary Targeting in North Eastern Nigeria. Directive: NCO/PU/2019/04.




1. Beneficiary profile, using FAO-WFP survey data

A total of 2,708 households were interviewed in the FAO-WFP Shocks, Agricultural Livelihoods and Food Security Survey in Ayeyarwady, Chin, Kachin, Kayah, Kayin, Mon, Rakhine, Shan and Yangon to monitor food security and livelihoods of persons in Myanmar. Some of the most key data collected were on the various food security indices – the Food Consumption Score (FCS), the Food Insecurity Experience Scale (FIES) and the Livelihood Coping Strategies Index (CSI). Much more detail can be gleaned from the report itself – this document focuses only on the aspects of the survey which can be used for prioritisation. Information was also collected on basic household demographics as well on income sources.



1.1 Overview of the food security indicators

A composite of the three indices, the Food Insecurity Score has also been calculated. The construction of this composite score is detailed in section 4.2. But going forward, this document will use the Food Insecurity Score as a proxy for food insecurity itself.

The plots below ranks variables in order of their ability to predict the various food insecurity indices. Only environmental or demographic variables were taken into account as it would be redundant to predict food security indices using the components of said indices. Only responses that occurred more than 200 times (out of 2,708) in the survey were considered.

Variables that are more red are most likely to result in high food insecurity scores (that is, higher food insecurity) and variables that are more blue are more likely to result in lower food insecurity scores. The dotted red line down the middle at \(x=0\) splits variables into whether the predict higher food insecurity (positive numbers) or lower food insecurity (negative numbers).

For all these plots, the scores of the food security indices have all been scaled between 0 and 1, with higher scores indicating greater food insecurity. The coefficient estimates below show how much a positive response on these variables would increase or decrease the score on each of the indices.



The variables that tend to to contribute the most to high food insecurity scores are a household’s exposure to conflict and natural hazards, whether or not they lost employment or work opportunities, whether or not they were engaged in casual non-agricultural labour and whether or not they reported no income in the three months prior to the survey.

These variables can be thought of as a basic beneficiary profile that can inform beneficiary selection criteria for food security and livelihoods programming. This list is, of course, non-exhaustive as it is limited to only the variables that were collected as part of the FAO-WFP survey.

The variables that were the best predictors of low food insecurity were whether or not the head of household had completed higher education, whether or not the main income source of the household was stable non-agricultural employment.



1.2 Setting a threshold for prioritisation

An important step is narrowing down the population to a priority group – Food Security Cluster partners do not have the resources to target all persons.

A household would be considered a priority for intervention when above the 75th percentile in at least two out of the three food security indices (food consumption score, coping strategies index and food insecurity experience scale)

Approximately 34% of the sampled population falls into this priority group. The plots below shows the differences between the average values of food security index components based on whether they are priority households or not. Variables in blue correspond to Coping Strategies Index indicators, those in red to the Food Insecurity Experience Scale.

Those in green correspond to the Food Consumption Score. For these indicators, they have been rescaled so that a value of 1 shows that a household has not consumed that food group at all in the previous 7 days and a value of 0 shows that they have consumed that food group every day for the past 7 days.



Whilst both groups tend to consume low amounts of dairy, pulses, sugar and fruits, these trends are much more pronounced in the priority group. Additionally, households in the priority group are more than twice as likely to have poor protein consumption, be worried about not having enough food and eat less due to a lack of resources.

Households in the priority group were also more than four times as likely to have reduced healthcare expenditures, have sold productive assets and be unable to eat healthy and nutritious foods and eat only a few kinds of foods. They are also more than five times as likely to skipped meals or gone hungry.


1.3 Variables considered in the beneficiary profile

The interactive reference table below shows the various environmental and demographic variables collected by the FAO-WFP survey. The first column lists the variable name, the second and third show the mean values for each variable based on households inside and outside of the priority group – for instance, from the table, it can be seen that 2.96% of households within the priority group do not have improved sanitation whereas for households outside of the priority group, this percentage is 1.42%.

The fourth column shows the percentage difference between households in the priority group and households outside of it. To continue the example, households in the priority group are 107.55% more likely to not have access to improved sanitation than households outside of the priority group. The table is sorted in descending order based on this column.

The last column is the percentage of the surveyed population that the variable corresponds to. So, in spite of households in the priority group having much lower access to improved sanitation, this variable only applies to 2.23% of the total population, meaning that whilst this indicator might be very predictive of households in the priority group, using it on its own would lead to high exclusion errors as it only applies to a small proportion of the population. Sorting the table by %_sample.



As expected, given that the priority grouping is largely based on the Food Consumption Score, Coping Strategies Index and the Food Insecurity Experience Scale, the variables that are least likely (as can be seen by their negative %_difference) to be associated with households in the priority group are the household head having completed higher education, having a stable source of non-agricultural income, having the main income source be from livestock and having self-employment or non-work (rents etc.) being the main income source.

Partners are encouraged to make use of the list of variables above, in addition to community perspectives and their own expert judgement, to formulate the beneficiary selection criteria for their food security programmes. The next section makes use of decision trees to find which of these variables are the most useful in splitting the population into households within the priority group and those outside of it.



1.4 Decision trees

This section focuses on the creation of simple tools to aid in the identification of households in the priority group. This involves narrowing down the list of 36 variables in the reference table above to develop two simple decision trees, one focused on a household’s environment and circumstances and the other on a household’s demographics.

Both these trees have been kept simple as making them deeper (i.e. by including additional variables and more nodes) provides very limited gains in exchange for a lot of added complexity. Additionally, as decision trees grow larger, they get much less interpretable.

Each tree starts at the root, node [1] in this case, which contains the entire population. From there, it branches out based on the various conditions at each node until it terminates in four groups (4, 5, 6 and 7 in the tree below). Within each blue square, the figure in bold show the percentage of each group that are priority households and the figures in italics show the percentage of the overall population in each node.

The first tree, dealing with a household’s environment and circumstances is comprised of three splits – whether a household is in a rural area, whether they have experienced violence, insecurity or conflict and whether they have lost work or employment opportunities.


Decision tree – environment and circumstances

The percentage of priority households in rural areas is much higher than in urban ones (37.6% vs 26.1%). For rural areas, the indicator that best distinguishes priority households is whether or they have directly experienced violence, insecurity or conflict in the past three months. The factor that best distinguishes priority households in urban areas is whether or not they have lost work or employment opportunities in the past three months.

The performance of the decision tree is not exactly spectacular – if a partner wanted to target an entire community, the threshold for blanket coverage would be around 75% or 80% of households being in the priority group, which none of the terminal nodes achieve. But the tree is very understandable at least provides some direction for identifying beneficiaries at the community level once geographic prioritisation has been conducted (which is the topic of section 2).

These findings are also consistent with IFPRI’s survey on household welfare where rural households were found to be more asset-poor and less resilient than urban ones. However, much more work remains to be done on triangulating the FAO-WFP survey with the IFPRI one, which was much more comprehensive in scope and scale.

The second tree below makes use of demographic variables (age of head of household, whether or not the head of the household is female etc.). These have been treated separately from the environmental and circumstantial variables above as combining them led to trees that did not make sense i.e. whether or not a household has children under 5 should have no bearing on whether or not they lost access to markets in the past three months. Both trees start from the same root i.e. 100% of the population.

In the second tree below, which splits the population into three terminal nodes (B, D and E), households whose heads have not completed secondary and/or higher education and have children under 5 years of age are most likely to fall into the priority group (46.8%). Households whose heads have competed secondary and/or higher education are least likely to fall into the priority group, irrespective of the age of their children or even if they have children.


Decision tree – demographics

These decision trees have been constructed not to direct decisions in partners’ programmes, but more to inform them, and should not be treated as absolutes – there are a wide variety of contexts in Myanmar and each community will likely have additional relevant criteria.

But the application of the conditions set in this tree and the first one (in blue) will lead to much lower inclusion and exclusion errors in beneficiary selection. The Food Security Cluster remains open to more data that will help improve our collective understanding of food insecurity in Myanmar.



1.5 Exceptions for targeting agricultural households

Returning momentarily to the first tree on environmental and circumstantial variables (in blue), 64.7% of the total population is in the tree node [6] (the nodes are all numbered in the decision tree above) – within this group are households who reside in rural areas but have not been affected by violence, conflict or insecurity. Given that this is a significant chunk of the population where, with reference to the plot below, 78% of the population is involved in agriculture, an exception can be made in this one instance, to support partners who might want to select beneficiaries within the large group of agricultural households who have not been affected by conflict.

It must still be mentioned that aid must first flow to the households in node [7], where the proportion of households in the priority group is highest. Only after the needs of this population are met should households in node [6] be targeted.



The tree below carries on from node [6] of the main decision tree on environmental and circumstantial variables. Within this group of rural households not affected by conflict (64.7% of the total population), identifying households who have lost access to markets due to conflict, infrastructure damage or other access issues and households who have been affected by natural hazards (the most common of which is flooding) improves the chances of targeting households in the priority group to slightly above 50%.

Any further conditions applied on the tree only result in extremely marginal gains.


Decision tree – from tree node [6]


To further inform the selection of beneficiaries in these areas, the plot below shows the coefficients of environmental and demographic variables on food insecurity within the households in node [6]. The more positive (more red) the coefficient, the higher the impact on food insecurity.

The variables within the FAO-WFP survey most of use to partners targeting priority households in node [6] are whether or not a household has improved sanitation and the educational attainment of the head of the household. The most important shocks for this group were natural hazards and the loss of work or employment opportunities.




1.6 Impact of conflict on food security

Conflict has a real impact on food security. Exposure to conflict in these households was linked with a 0.032 increase in score, which is, on average, a 42.46% higher.

Though the FAO-WFP survey was not developed with measuring the impact of conflict in mind, it is nevertheless possible to control for some factors and examine the impact of conflict on several groups.

The plot below shows the impact on the overall food insecurity scores based on whether a household has been impacted by conflict or not. We have selected the two largest groups within the rural and urban context (farmers and workers employed in stable, non-agricultural employment) and have split these populations by education level.



The food insecurity scores of all groups except one are higher when a household has experienced conflict. This by no means constitutes a scientific proof (another survey would have to be conducted), but it is possible to state with some confidence that exposure to conflict has a negative impact on food security. The small sample size likely results in widely diverging values in some cases; additionally the purpose of the FAO-WFP survey was not to understand conflict dynamics.

The plot below further examines of the impact of conflict on food security. The estimates in the plot below show the impact of exposure to conflict on the various food security indices. As was done above, the food security indices used were re-scaled between 0 and 1, with higher scores indicating greater food insecurity.

Notably, exposure to conflict had the largest impact on the Food Insecurity Experience Scale in rural areas. All the effects were statistically significant with the exception of conflict on Food Consumption Scores in urban contexts (that point is marked by a triangle in the plot below to denote this).



Approximately 6% of all the households surveyed by FAO-WFP were directly affected by conflict, violence and insecurity. However, this does discount households that have been affected by the secondary impacts of conflict, such as loss of access to markets and increased food prices.

Whilst there is no set threshold whereby one can state that everyone in a given area has been affected by conflict, it is possible to determine where the conflict has been the most severe. In the next section, conflict scores, together with pre-existing vulnerability will be used to prioritise between townships.




2. Prioritisation of townships by exposure to conflict and pre-existing vulnerability

Myanmar had the most conflict events out of any country in 2021, exceeding Syria, Yemen and Afghanistan.


Increase in conflict events and fatalities compared to previous decade
years total_events avg_events_per_year total_fatalities avg_fatalities_per_year
2010-2020 8,510 774 9,451 859
2021 10,961 10,961 11,012 11,012
2022 5,873 5,873 9,383 9,383
Data source: ACLED; accleddata.com. Data for 2022 is until 2022-05-31.


Given the more than fourteenfold increase in conflict events and thirteenfold increase in conflict fatalities in Myanmar in 2021 (compared to the average for the preceding 10 years), conflict will be major part of determining which areas have the greatest humanitarian needs. However, scoring townships based only on one variable would lead to a very uni-dimensional understanding of the crisis.

Similar to how a beneficiary profile was established in order to inform beneficiary selection, this section, will focus on what variables should be considered when prioritising amongst the various geographic areas in Myanmar and how the results of such a prioritisation should be applied. As with earlier sections, the analysis here is meant to describe and inform programmatic and operational decision making, as opposed to dictating it, as each partner will have their own considerations and limitations.

For a more comprehensive review of conflict in Myanmar, please refer to the Food Security Cluster’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. And for a more comprehensive review of multidimensional vulnerabilty in Myanmar, please refer to MIMU-HARP’s Vulnerability Study.



2.1 Conflict events and fatalities by state/region


Starting at the state/region level, Sagaing saw the highest number of conflict events as well as conflict as well as conflict-related fatalities in 2012. It experienced more than three times as many conflict-related fatalities than the next-highest state/region – Magway. This is a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.

Kayah, Chin and Sagaing had the highest number of conflict fatalities per capita in 2021.




2.2 Conflict score by township

As can be seem from the state/region barplots in the previous section, the distribution of conflict events and fatalities is not even, and is skewed towards a few states/regions. This is also evident at township level. In the scatter plot below, the averages of the number of conflict events and the number of fatalities at the township level have been marked by the dotted red lines, dividing the plot into four quadrants.

To better discriminate amongst the numerous townships, a conflict score has been developed. A requisite for any prioritisation score or index for conflict should be the ability to distinguish, first and foremost, the townships in the upper right quadrant of the plot, which have the heaviest concentrations of conflict events and fatalities. These areas are also where, as we have established in the section on beneficiary selection, where the highest concentrations of households in the priority group will be found. For reference, 58 townships have both above-average numbers of conflict events and fatalities (upper-right quadrant) and 196 townships have both below-average numbers of conflict events and fatalities (bottom-left quadrant).



At its most basic, the conflict score is just the average of battles, explosions, remote violence, violence against civilians, strategic developments, non-peaceful protests and riots, conflict-related fatalities and IDPs (refer to section 4.5 for more details). Additional information can also be found in the FSC’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. This score will be now be used as a shorthand for conflict incidence in Myanmar going forward.



2.3 Comparison with multidimensional vulnerability

Conflict, in spite of its out-sized role in the crisis in Myanmar, cannot serve as the only determinant of geographic prioritisation. In order to consider other factors, this document will make use of the MIMU-HARP Vulnerability Index, which is comprised of 8 indicators, selected for their ability to predict the rest of the variables in the 2015 Census dataset. Several of these variables were also collected at district-level and were used to create an updated 2019 Vulnerability index.

The specific indicators chosen were:

  • % of population without formal identification documents
  • % of population without a middle school education
  • % of females who were illiterate
  • % of households with bamboo or thatched roofs
  • % of households with safe sanitation
  • % of households with access to electricity
  • % of workers who are unpaid family workers
  • The child dependency ratio
  • The conflict index (reflecting battles, fatalities, violence against civilians and displacement)

These indicators were combined to construct a township-level vulnerability index. Of the indicators above, only the percentage of the population without a middle-school education and percentage of the population without formal identification documents were not collected in the 2019 Inter-Censal survey.

For the remaining indicators, they were bootstrapped using their 2015 township values and the 2019 district-level data. Going forward, the first seven components of the index will be extracted and treated separately as a shorthand for pre-existing multidimensional vulnerability in Myanmar.

However, the eighth component of the vulnerability index, the conflict index, first constructed in 2015 from ACLED data, can and has been updated with more recent data – this was done in the previous section. This next few sections will examine the relationship between underdevelopment and the updated 2021 conflict score and the resulting implications on geographic prioritisation for the Food Security Cluster.

Firstly, from the scatter plot below, underdevelopment and pre-existing vulnerability and conflict are not good predictors of each other. The points in the plot below, each representing a township, split largely across two arcs – with townships with high conflict scores largely falling around the median for multidimensional vulnerability and townships with very high multidimensional vulnerability tending to have lower conflict scores.



This is a reflection of the shift in conflict away from frontier areas to cities and towns that have more strategic targets. The broader involvement of the Bamar majority in the conflict has likely also contributed to this shift – prior to the February 2021 coup, the conflict was largely between Ethnic Armed Organisations and the Myanmar Armed Forces. However, combatants are now spread throughout the populations, especially with the proliferation of the People’s Defence Forces.

It has been observed that Ethnic Armed Organisations, such as the Kachin Independence Army, are working closely with the People’s Defence Forces, and are training and arming them. This has contributed to the front being moved further forward, outside of the areas that had been traditionally most affected by conflict.



2.4 2015 vulnerability bands

This shift in conflict patterns can be further examined by considering the vulnerability bands developed by MIMU-HARP alongside its vulnerability index. In addition to an overall vulnerability score per township, 8 main typologies of vulnerability were also constructed to illustrate the wide variation of contexts and needs in the different parts of the country as well as to group together similar townships so that they may be considered as separate programming blocs. Please refer to the MIMU-HARP Vulnerability Study for more details.

According to MIMU-HARP, the result of this grouping is a “lens allowing the most vulnerable to be considered more methodically in policy and programme planning”. By using these 8 typologies as a reference, it is possible to understand how the pattern of conflict has changed between 2015 and 2021.


Changes in conflict patterns between 2015 and 2021, by vulnerabilty band
conflict score
townships above avg conflict score
vulnerability_band 2019_vulnerability 2015_score 2022_score tsp_count %_>avg_2015 %_>avg_2021
  1. Extreme outliers, underdevelopment and conflict
0.549 0.055 0.045 36 38.89 11.11
  1. Conflict-affected, poor human development
0.449 0.053 0.081 25 44.00 16.00
  1. Hubs in conflict-affected areas
0.370 0.033 0.215 21 19.05 47.62
  1. Very low access to services and infrastructure
0.403 0.003 0.112 74 4.05 25.68
  1. Agricultural areas with high profits
0.356 0.003 0.108 64 1.56 25.00
  1. Secondary cities/towns in agricultural areas
0.300 0.008 0.127 65 12.31 38.46
  1. Up-and-coming peri-urban and urban areas
0.228 0.000 0.120 11 0.00 27.27
  1. Affluent, urban core
0.123 0.001 0.156 34 2.94 58.82
Data source: ACLED (accleddata.com) and MIMU; higher scores indicate more vulnerability/conflict


Conflict, once much more concentrated in underdeveloped frontier areas in the operational areas of Ethnic Armed Organisations, is now much more pronounced in bands 3, 6 and 8, which contain major population centres and secondary cities and towns. Hubs in conflict-affected areas have the highest average 2021 conflict scores.

Although conflict has persisted or even increased in many of the frontier and remote areas such as Laukkaing, Mongyai and Tangyan (all from band 1), the relative rankings of these areas have changed and they now form a much smaller share of unionwide conflict than they did in 2015. These townships tend to have much lower conflict scores in spite of their high vulnerability, indicating that whilst they remain development priorities, they should fall outside the caseload for humanitarian action. It is recommended that new vulnerability bands be re-developed, as they have proved very useful; but that is outside the scope of this document.



2.5 Clustering townships

In recognition of the different contexts present in Myanmar (and the consequent need for different programming options), a simple K-means clustering was conducted on the townships to split them into prioritisation groups based on their 2021 conflict score, their 2019 vulnerability score and their population density.

This clustering separates all 330 townships into five groups. The plots below show the spread of townships by prioritisation group across the 2021 conflict score, 2019 vulnerability score and population density.



It can be seen that groups A1 and A2, which have the highest conflict scores, are quite distinct from group D (where the majority of the development caseload resides). Group C has neither high vulnerability nor high conflict incidence. And group B consists of solely urban centres. The table below provides more detail on each of the groups.

Groups A1 and A2 contained 60% of all conflict events and 83% of all conflict fatalities in 2021. Groups A1 and A2 can be distinguished from each other by the intensity of conflict, with A1 being where the concentrations of conflict events and fatalities are the heaviest.

An interactive version of the plot on the left can be found below.


Summary statistics by prioritisation group
group %_conflict_events %_fatalities avg_conflict_score vulnerability_2019 ppl_km2 townships %_total_population
A1 27.22 45.21 0.289 0.358 107 20 6.32
A2 33.22 37.79 0.138 0.349 133 49 17.76
B 11.95 3.39 0.087 0.122 19,326 33 12.12
C 23.90 11.51 0.024 0.340 213 172 51.65
D 3.70 2.09 0.016 0.551 64 56 12.15
Groups A1 and A2 have the highest conflict scores and should be prioritised over the others. Higher scores indicate more vulnerability/conflict.


Groups A1 and A2 both have middling vulnerability scores, but have much higher average conflict scores. Group A1, in particular, has a very high concentration of conflict incidents and fatalities, in addition to having the second-highest vulnerability scores of the groups. These 69 townships (containing about 24% of the population) are clear priorities for humanitarian action.




2.6 Linking geographic prioritisation and beneficiary selection

Using the classifications from the decision tree in section 1.3, we can see that in rural areas, the highest proportions of people who are in the priority group are those who have been affected by conflict, followed by those who were affected by conflict and have lost work or employment opportunities. Rural areas severely-affected by conflict (the townships in groups A1 and part of A2) are the areas in which we may reach populations with the highest proportions of households in the priority group.


Where are the highest proportions of persons in priority groups?
Rural Shocks_Conflict Shocks_Lost_Work %_Priority
no no yes 42.13
yes no yes 42.21
yes yes no 65.95
yes yes yes 61.27
Data sources: ACLED; acleddata.com and FAO-WFP


In urban areas (largely group B, and part of A2), however, conflict incidence is not as important of a determining factor – the best results can be achieved by targeting people who have lost work or employment opportunities, irrespective of whether or not they have been affected by conflict.

The table below shows the characteristics of the population groups that have the lowest concentrations of priority households.


Which areas have less people in the priority group?
Rural Shocks_Conflict Shocks_Lost_Work %_Priority
no no no 18.47
no yes no 22.36
no yes yes 25.34
yes no no 34.51
Data sources: ACLED; acleddata.com and FAO-WFP


As mentioned earlier, rural households were found to be less resilient and more asset-poor in IFPRI’s household welfare survey. These findings align well with the process the Food Security Cluster has developed here to identify priority households (where rural households are significantly more likely to fall into the priority group). It would be extremely fruitful to explore whether this alignment extends to conflict and some of the other environmental and socioeconomic variables that have been employed in this document.

It should also be noted that townships themselves are quite large – on average, each has a population of 161,913 persons. In areas where partners are not yet present, this might necessitate an intermediate step to help partners identify specific areas where they could begin working.

In the ACLED dataset, of the 10,961 events in 2021, 38% of them were recorded with specific village locations.


Conflict events with and without villages
mentions_vilage events %_events fatalities %_fatalities locations
yes 4,142 37.79 5,348 48.57 1,919
no 6,819 62.21 5,664 51.43 300
Data source: ACLED; accleddata.com


Below is an interactive reference table of the 1,917 villages identified in the ACLED dataset, complete with coordinates. While this list does provide an excellent start, by working in these areas, partners should also endeavour to identify the specific locations of the remaining 62% of conflict events.




2.6a Sample beneficiary selection process

Though partners are likely to already have their own beneficiary targeting procedures, based on WFP’s guidelines, an example targeting procedure is listed below, with reference to the information presented in this document.

Sample targeting process

  • Identification and selection of geographical area

    • Selection of township, from the relevant prioritisation group
    • Coordination with the Cluster and Cluster partners to ensure that there are no duplications and that areas served are in line with the severity and magnitude of humanitarian needs
    • Ensure that programming is reflective of the context of the area targeted – rural or urban, conflict-affected or not
  • Set up complaints and feedback mechanism to ensure that issues and concerns raised by community members are addressed efficiently. The complaints and feedback mechanism will be active throughout this entire process.

  • Enumeration and headcount of community members

  • Formation of beneficiary targeting committee which is representative of the community

  • Presentation of draft targeting criteria, for example (selected from variables most predictive of food insecurity from section 1.1 and decision trees):

    • Households which have lost work of employment opportunities
    • Households which have suffered from natural hazards
    • Households which have been affected by conflict, insecurity or violence
    • Households which rely on casual, non-agricultural labour for income
    • Households which have no income source
    • Households whose head have no educational attainment
    • Households with children under 5
    • Households whose members include persons with disabilities
  • Sensitisation and consultation on beneficiary selection criteria and finalisation of selection criteria

  • Drafting of beneficiary list – only households which meet the established criteria should be included

  • Public posting of initial beneficiary list, for public comment, typically for a maximum of 5 days

  • Spot checks and verification on a random selection of selected households

  • Beneficiary registration



2.7 5W results from the first quarter of 2022

In the first quarter of 2022, Food Security Cluster partners have reached a total of 2,233,533 persons or 54.48% of the 2022 target. Below is an examination of the extent to which partners have targeted the townships most affected by conflict.

In this first plot, the number of beneficiaries reached in the first quarter of 2022 are plotted against the targeted population. Each point is a township and the red line down the middle represents reaching 100% of the target. How far above or below a township is indicates how far above or below the target it is. Additionally, the township prioritisation group each township belongs to is marked by the colour.

The townships on the far left of the plot have beneficiaries despite not having targets for 2022 (their targets have been nominally coded as \(1\) so they appear on the plot).



With reference to the table below, 2.8% of beneficiaries came from group A1 and 10.7% of beneficiaries came from group A2. On the surface, this seems like partners have made effort to reach conflict-affected townships. However, this reach has largely been due to oversubscription in Sittwe, where the number of beneficiaries reached in 152% of the target.

The development of the prioritisation groups also brings up the broader point of whether or not cluster targets are in line with needs and if they should be reformulated based on the information now available, as the targets in groups B and C are noticeably higher than those in group A. Nevertheless, it is hoped that partners will be able to afford townships in groups A1 and A2 greater coverage as the year progresses.


2022 Q1 beneficiaries and percent reached by prioritisation group
group beneficiaries %_ben target gap %_gap tsp_reached tsp_total
A1 64,544 2.89 178,541 134,400 75.28 7 20
A2 239,406 10.72 465,799 322,637 69.27 17 49
B 1,453,511 65.08 1,432,480 983,963 68.69 3 33
C 249,727 11.18 1,588,332 1,480,916 93.24 24 172
D 226,345 10.13 434,862 356,379 81.95 20 56
Any reach above 100% is counted as 100%; exceeding the target in one township does not affect other townships


Overall, these are not encouraging results. Notably, only 3,450 beneficiaries being reached in the whole of Sagaing, where the fighting has been heaviest. It is recommended that targets and plans for the Food Security Cluster be reviewed, and partners be reminded to reallocate resources away from oversubscribed areas and away from group C, which are neither humanitarian nor development priorities.



2.8 Maps of conflict scores and prioritisation group



2.9 Reference table for conflict variables

Below is an interactive reference table for the various types of conflict events by township. It also includes the overall conflict score and prioritisation groups. The search bar can be used to find specific townships, or any of the columns may be sorted according to ascending or descending values. The table currently shows townships in descending order of conflict score.





3. Distribution of flood risk in Myanmar

3.1 Historical flood data

In light of the impending monsoon season, the probability that a township will be affected by a major flood or cylconic event has been calculated. Major floods since 2008 have been factored into this calculation.

For the moment, conflict incidence and flood and cyclone risk will be evaluated separately. Flood and storm surge risk exist as probabilities for the moment and are intended to support prepositioning and Disaster Risk Reduction. This might change were severe flooding to occur in 2022.



Based on this data, a score was calculated for each township based on how many times it had been affected by floods since 2008. The table below also summarises the number of people in need (2022). 2,210,725 people live in townships that have flooded more than 5 times since 2008.

Summary statistics by number of floods (2008-2021)
flood_count townships people_in_need
9 1 55,490
8 4 333,874
7 7 292,124
6 15 565,632
5 23 963,605
4 33 1,769,108
3 54 2,735,536
2 70 2,994,977
1 73 2,213,089
0 50 1,299,033
Data source: MIMU and UNDP



3.2 Map of flood risk

The map below shows the probability of each township being affected by floods. The areas with the greatest risk of flooding are in Mon, near the mouth of the Sittaung River and the Gulf of Mottama and those along the Ayeyarwady River, and to a lesser extent, along the Chindwin River.




3.3 Reference table for flood risk

Below is an interactive reference table for flood risk by township. It includes the number of times since 2008 a township has been affected by flooding (flood_count) and the probability of flooding (flood_risk). Similar to the interactive table in the previous chapter, the search bar can be used to find specific townships and any of the columns may be sorted according to ascending or descending values. The table currently shows townships sorted in descending order of flood risk.





4. Technical notes

These annexes contain additional technical information that informed the decisions in the earlier sections.

4.1 Limitations and next steps


FAO-WFP food security survey

The most important limitation of the FAO-WFP survey was the exclusion of several key states and regions from the survey. Of particular interest are Sagaing, Magway and Mandalay where the conflict has been particularly intense.

Furthermore, the dry zone was not surveyed. From an agricultural perspective, this is a major omission as the diversity of crops and, consequently, diets are much higher in the dry zone than in the other parts of the country, which are predominantly focused on paddy.

Additionally, the targeting process proposed in this document has not yet been trialled in the field. The Food Security Cluster does not have the resources to undertake a field test of this scale. However, every attempt has been made to corroborate the data presented in it.

In spite of these major limitations and the numerous assumptions that have had to made, the FAO-WFP survey is most comprehensive dataset on food security that has been collected so far. Additional efforts will be made to cross-reference these data from those of other surveys. These models will be updated once the third round of the FAO-WFP survey is ready. As a final point in this section, the FAO-WFP survey, in spite of its limitations forms the basis of the People in Need calculations, which underpins a lot of the response.

This paper serves a proposal on how vulnerable households (such as those in the priority group) may be identified and targeted. Should this methodology prove sound and viable, it is suggested that it be applied to either IFPRI’s Household Welfare Survey as well as data collected in the third round of the FAO-WFP food security survey.



MIMU-HARP vulnerability analysis

The results of the 2015 MIMU-HARP Vulnerability Analysis (used to inform scores for multidimensional vulnerability), have been updated using the 2019 Inter-Censal Survey results using the following formula:

\[ 2019TspValue = 2015TspValue / 2015DistrictValue \cdot 2019DistrictValue \]

This allows the new township values to tally with the 2019 district-level inter-censal survey results as well as to preserve the order and relationships of townships within each district. For the two indicators in the 2015 dataset but not covered in the 2019 inter-censal survey, they were forward filled, using their 2015 values. To further improve these estimations, multiple imputation should be employed. But that will be left for any subsequent revisions to this document.



Conflict data and ACLED

Perhaps the most key limitation has also been the lack of field access and detailed assessment data from many parts of the country. With the conflict ongoing, and the footprints of humanitarian agencies largely skewed towards Yangon and Rakhine, which have been comparatively less affected by the current crisis, there is a demonstrable dearth of first-hand information in key areas. This document has intended to circumvent this through the use of ACLED data, which is the most complete set of conflict incident data in Myanmar.

However, the ACLED dataset is not without its limitations – the majority of its information, about 85 percent, comes from subnational, national and international media sources. The remainder comes from ACLED’s partner, the Myanmar Peace Monitor, and reports from UN agencies, international monitoring groups, and local human rights organisations. The completeness of the conflict data and how representative it is of the situation on the ground is not something that is easily verifiable. Though it should be noted that ACLED still has the largest and most comprehensive dataset of conflict incidents in Myanmar.



Targeting limitations

The targeting processes proposed in this document have not yet been field-tested. Whilst the Food Security Cluster is confident of its analysis, it does not have the resources to undertake a field trial to understand how what has been proposed here will impact operations. Access to affected areas has also not been considered.

Finally, the prioritisation process is not entirely seamless – whilst it is possible to prioritise from the union-level down to the township level and from the village down to the household with few issues, there remains a gap between the township and the village. In large part, this is due to the dearth of data available at the village-tract and village levels. The Food Security Cluster has partially mitigated this through the provision of village names listed in the ACLED dataset, but this is also a partial list and not fully matched at the village-tract levels either. Unless there is a full enumeration of village tracts and villages in Myanmar, this issue is likely to persist.



4.2 Food insecurity score

Food insecurity here is not recognised solely as a food secure/food insecure dichotomy and is instead treated as a matter of degree determined by an household’s position the overall distribution of food security indicators. According to Betti and Verma, “by appropriately weighting non-monetary indicators of deprivation to reflect their dispersion and correlation, it is possible to construct quantitative indices of deprivation in its various dimensions”. At its most basic, the food insecurity score is a weighted sum of its component indicators that rewards variables that are responsible for more of the variation in the dataset.

To calculate the Food Insecurity Score, variables within the Livelihood Coping Strategies Index, Food Consumption Score and Food Insecurity Experience scale were rescaled to values between \(0\) and \(1\). For most of the variables, \(1\) meant “yes” and \(0\) meant “no”; however, for the Food Consumption Score indicators, \(0\) meant that a household had consumed that food group every day for the past 7 days and \(1\) meant that a household had not consumed that food group for any of the prior 7 days. Additionally, coping strategies indicators at the “crisis” level were coded as \(0.5\) for “yes” and indicators at the “emergency” level were coded as \(1\) for “yes”. This is to replace the typical severity weighting that would normally have occurred but was not part of the FAO-WFP survey process.

These calculations have been encoded in the R package mdepriv by Attilio and Aldo Benini, building on work done by Alperin and Van Kerm on their mdepriv Stata package. According to Alperin and Van Kerm, “mdepriv creates synthetic scores of deprivation that are linear functions of uni-dimensional deprivation items measured on the [0, 1] scale. With \(x_{ij}\) denoting the value of a particular deprivation items \(j\) for observation \(i\). The synthetic scores calculated by mdepriv are weighted sums of the \(M\) deprivation items:

\[ s_i = \sum_{j = 1}^{M}{w_j}x_{ij} \]

A food insecurity score was then calculated using the weighted sum of the individual variables. The weighting scheme chosen was the default for the mdepriv package, Cerioli and Zani (1990) weighting. Under this weighting scheme, variable weights are “frequency-based” and are a function of their sample mean but just slightly modified to give a stronger weight to relatively rare items so that variation is rewarded:

\[ w_j \propto log(\frac{1}{\bar{x}_j}) \]

The specific code for generating the food insecurity score was:

food_insecurity_score <- survey %>% 
  mutate_at(vars(cs_crisis_sold_prod_assets, cs_crisis_no_school, 
                 cs_crisis_reduced_health_exp), ~ . * 0.5) %>% 
  select(survey_id, hhfcs_inv, # inverse of food consumption score
         cs_crisis_sold_prod_assets, cs_crisis_no_school, 
         cs_crisis_reduced_health_exp, cs_emergency_sold_house, 
         cs_emergency_hh_migration, cs_emergency_hh_risk,
         fies_fewfood, fies_skipped, fies_whlday, fies_hungry, 
         fies_ateless, fies_healthy, fies_runout, fies_worried, combined_wt) %>% 
  mdepriv(c("hhfcs_inv", 
         "cs_crisis_sold_prod_assets", "cs_crisis_no_school", 
         "cs_crisis_reduced_health_exp", "cs_emergency_sold_house", 
         "cs_emergency_hh_migration", "cs_emergency_hh_risk",
         "fies_fewfood", "fies_skipped", "fies_whlday", "fies_hungry", 
         "fies_ateless", "fies_healthy", "fies_runout", "fies_worried"), 
         output = "all", sampling_weights = "combined_wt")



4.3 Limited performance of linear regression models

Prior to the development of the decision trees detailed in section 1.3, a linear regression model had been considered. However, no matter how sophisticated the method, the highest r-squared achieved was 0.136 (a model with an r-squared with 1 would mean it was perfectly predictive and an r-squared of 0 means that a model does not predict any of the variance at all; in this case, the best linear regression model still left 86% of the variance unexplained).

With reference to the plot below of predicted values of the food security score vs the actual values (of the best performing model), whilst there is a significant relationship, its predictive performance is too weak. This was why decision trees were employed instead of a linear model. Each point in the plot below is a household in the survey.



The relatively low r-squared is likely due to missing variables in the FAO-WFP survey. For instance, the factors that go into a household’s decision to reduce their healthcare expenditures are too multifarious to be captured by a survey on food security.

This pattern was also true for the overall food security score as well as the individual food security indices (Food Consumption Score, Food Insecurity Experience Scale and Coping Strategies Index).

For additional reference, the table below shows the top 15 variables ranked by the percentage of variance of the food security score that they explain.

Variables ranked by percent of variance
term pc_variance
Residuals 85.66
shocks_none 5.89
income_ms_stable_non_ag 1.74
shocks_lostwork 1.16
rural 0.91
shocks_conflict 0.68
not_improved_sanitation 0.59
income_ms_selfem_nonwork 0.54
age_18_40 0.46
shocks_naturalhazard 0.43
income_ms_agriculture 0.39
income_ms_livestock 0.31
shocks_pricesother 0.29
age_41_65 0.25
shocks_sicknessdeath 0.23


As a point of reference, below is the code for the decision tree.

tree_environment_circumstances <- survey %>% 
  rpart(priority ~  shocks_lostwork + shocks_sicknessdeath + shocks_foodprices + 
          shocks_conflict + shocks_cantworkbusiness + shocks_naturalhazard + 
          shocks_accessmarket + shocks_pricesother + shocks_other + 
          rural + not_improved_sanitation,
        data = .,  weights = combined_wt , cp = 0.01)

tree_demographics <- survey %>% 
  mutate(children_0_4 = ifelse(children_0_4 > 0, 1, 0)) %>% 
  rpart(priority ~ children_0_4 + hoh_female + hoh_education + hoh_age, 
        data = ., weights = combined_wt, cp = .0088)



4.4 Pairwise correlations of indicators in the FAO-WFP survey

The table below shows the top 20 correlations between the different variables collected by the FAO-WFP food security survey. When a particular variable is of interest, it may be useful and interesting to see which other variables it is most correlated with.

The vast majority of the variables, with the exception of composite scores and indices, are binary, with 1 being true and 0 being false. In these cases, a correlation of 1 would mean that a variable is true for all the households in which its match is also true; a correlation of 0.5 means that a variable is true for 50% of the households in which its match is true.

For instance, whether or not the head of the household has competed education (edu_higher) is most correlated with households whose main income source is stable non-agricultural income (income_ms_stable_non_ag). Similarly, a correlation of 0.175 between rural and edu_none indicates that in 17.5% of all rural households, the head of household has no formal educational attainment. It also should be noted that, as expected, the components of each of the food security indices are most correlated with each other.




4.5 Calculating the conflict score

The conflict score here originally appeared in the Food Security Cluster’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. It was calculated using ACLED data and yields a score for each township.

The conflict score is an update of the conflict index in the MIMU-HARP Vulnerability Analysis, using 2021 data. The specific conflict variables that included in the score were battles, explosions and remote violence, non-peaceful protests and riots, conflict-related fatalities, strategic developments and number of IDPs. Only the version of the conflict score within this document takes IDPs into account; in the Food Security Cluster’s earlier report on conflict (linked in the previous paragraph), the Cluster did not yet have access to detailed IDP data.

The conflict score is an average of the normalised values of key conflict indicators. Its main use it to aid decisions about geographic prioritisation. These normalised values have been re-weighted with Betti-Verma method, which penalises redundancy and rewards variation; this is the only notable divergence from the MIMU-HARP methodology. The Betti-Verma method was employed through the mdepriv package developed by Attilio and Aldo Benini.

Unlike the Food Insecurity Score, the component variables of the conflict index were not binary, meaning that it was possible to take advantage of the Betti-Verma method’s double-weighting rule which is sensitive to both the relative frequency of the variables and the correlation amongst variables:

\[ w_j \propto (w_j^a \cdot w_j^b) \]

However, it must be noted that whilst the scores themselves can be shared and used, replicating all the calculations will necessitate obtaining permission from UNHCR as their township-level breakdown of IDP populations have not been shared publicly. The specific code for calculating the conflict score can be found below.


# Betti-Verma calculations and the construction of the conflict score
index_shares2 <- conflict_df2 %>%   
  mutate_at(vars(c(battles, explosions_remote_violence, violence_against_civilians, 
                   fatalities, strategic_developments, 
                   protests_and_riots, total_idps)), 
           scale) %>%  
  mutate_at(vars(c(battles, explosions_remote_violence, violence_against_civilians, 
                   fatalities, strategic_developments, 
                   protests_and_riots, total_idps)), 
           funs((. - min(., na.rm = T))/(max(., na.rm = T) - min(., na.rm = T)))) %>% 
  mdepriv(c("battles", "explosions_remote_violence", 
            "violence_against_civilians", "fatalities", 
            "strategic_developments", "protests_and_riots", "total_idps"),
          # IDP counts have been used in the score, but will not be read 
          # into this report
          method = "bv", output = "all")
LS0tDQp0aXRsZTogIlRvd25zaGlwIFByaW9yaXRpc2F0aW9uIGFuZCBFc3RhYmxpc2hpbmcgYSBCZW5lZmljaWFyeSBQcm9maWxlIg0KYXV0aG9yOiAiTXlhbm1hciBGb29kIFNlY3VyaXR5IENsdXN0ZXIiDQpkYXRlOiAiMjUvMDMvMjAyMiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBjb2xsYXBzZWQ6IGZhbHNlDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZSAgIA0KLS0tDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQoNCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICIiOw0KICBkaXNwbGF5OiBibG9jazsNCiAgaGVpZ2h0OiA3MHB4Ow0KICBtYXJnaW46IDJlbSAyMHB4IDQwcHggMjBweDsNCiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJNeWFubWFyX2NsdXN0ZXJfYmx1ZS5wbmciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShwYW5kZXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShib29rZG93bikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkobWRlcHJpdikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KHdpZHlyKQ0KbGlicmFyeShycGFydCkNCmxpYnJhcnkocnBhcnQudXRpbHMpDQpsaWJyYXJ5KHJhdHRsZSkNCmxpYnJhcnkoYnJvb21zdGljaykNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeSh0aWR5dGV4dCkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShnZ3JpZGdlcykNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShnZ2ZvcmNlKQ0KDQp0aGVtZV9zZXQodGhlbWVfbWluaW1hbCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzLCAyIGdyb3VwZWQgdmFyaWFibGVzDQpzdW1fYmVuMiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3ZhcjEsIGNvbHVtbl92YXIyKXsNCiAgDQogIGNvbHVtbl92YXIxIDwtIGVucXVvKGNvbHVtbl92YXIxKQ0KICBjb2x1bW5fdmFyMiA8LSBlbnF1byhjb2x1bW5fdmFyMikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcjEsICEhY29sdW1uX3ZhcjIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KI21vZGUgZnVuY3Rpb24gDQptb2RlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdXggPC0gdW5pcXVlKHgpDQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0NCn0NCg0KIyBzaG93X2NvbCh2aXJpZGlzX3BhbChvcHRpb24gPSAiY2l2aWRpcyIpKDEwKSkNCmBgYA0KDQpgYGB7ciBkZi1wY29kZXMtc2hhcGVmaWxlc30NCiMgcGNvZGVzDQpwY29kZXMgPC0gcmVhZF9leGNlbCgiTXlhbm1hciBQQ29kZXMgUmVsZWFzZV85LjNfSmFuMjAyMV8oU3RSZ25fRGlzdF9Uc3BfVG93bl9XYXJkX1ZUKS54bHN4IiwNCiAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIjAzX1Rvd25zaGlwIikgJT4lDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBTUl9QY29kZSwNCiAgICAgICAgIHN0YXRlID0gU1JfTmFtZV9FbmcsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBUc3BfUGNvZGUsDQogICAgICAgICB0b3duc2hpcCA9IFRvd25zaGlwX05hbWVfRW5nLA0KICAgICAgICAgYWRtaW4yX3Bjb2RlID0gYERpc3RyaWN0L1NBWl9QY29kZWAsIA0KICAgICAgICAgZGlzdHJpY3QgPSBgRGlzdHJpY3QvU0FaX05hbWVfRW5nYCkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSAlPiUgDQogbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvd25zaGlwLCAiSGxhaW5ndGhhcnlhIiksICJNTVIwMTMwMDgiLCBhZG1pbjNfcGNvZGUpKQ0KDQpwY29kZTFfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsvbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUpICU+JSBzdF9hc19zZigpDQoNCmBgYA0KDQpgYGB7ciBkZi1mc2MtdnVsbW1yLWFjbGVkfQ0KIyByZWFkaW5nIGluIDVXcyAyMDIxDQpmc2NfMjAyMSA8LSByZWFkX2NzdigiZnNjNXdfMjAyMS5jc3YiKQ0KDQojIDIwMjIgUTEgNVdzDQpmc2MgPC0gcmVhZF9jc3YoImZzY19xMV8yMDIyLmNzdiIpDQoNCiMgcmVhZGluZyBpbiB2dWxuZXJhYmlsaXR5IGRhdGFzZXQNCnZ1bG1tciA8LSByZWFkX2V4Y2VsKCJEYXRhc2V0c19WdWxuZXJhYmlsaXR5X0FuYWx5c2lzX2luX015YW5tYXJfMDlKdWwyMDE4ICgxKS54bHN4IiwNCiAgICAgICAgICAgc2tpcCA9IDEpICU+JSANCiAgc2xpY2UoLWMoMTozKSkgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KC1sYWJlbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhudW1iZXJfb2ZfdmlsbGFnZV90cmFjdHM6d2Jfd2VhbHRoX3JhbmspLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGRpc2FzdGVyc19pbXBhY3RlZF9ieV9uYXJnaXNfMjAwODphY2xlZF8yMDE1XzIwMTZfZGF0YV9leGlzdHMpLCBhcy5sb2dpY2FsKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNvbmZsaWN0XzIwMTVfMjAxNl9udW1iZXJfb2ZfYmF0dGxlczpjb3JyZWN0ZWRfY29uZmxpY3RfaW5kZXhfZ2FycnkpLCBhcy5udW1lcmljKSAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoIngiKSkgJT4lIA0KICBzZWxlY3QoLWMocHJpdmF0ZV9zZWN0b3JfZGV2ZWxvcG1lbnRfMjAxNF8yMDE1LCBwcm90ZWN0aW9uXzIwMTBfMjAxNSwgc2hlbHRlcl8yMDEwXzIwMTUsIHdhc2hfMjAxMF8yMDE1KSkNCg0KDQojIEFDTEVEIGRhdGFzZXQNCmFjbGVkIDwtIHJlYWRfY3N2KCJhY2xlZF9uZXcuY3N2IikgJT4lIA0KICBtdXRhdGUoaGFzX3ZpbGxhZ2UgPSBpZl9lbHNlKGxvY2F0aW9uICE9IGFkbWluMywgInllcyIsICJubyIpKQ0KYGBgDQoNCmBgYHtyIGRmLWZzLXBpbi1hbmQtZGVwZW5kZW5jaWVzfQ0KIyByZWFkaW5nIGluIGNvbmZsaWN0IHNjb3JlDQpjb25mbGljdF9zY29yZSA8LSByZWFkX2NzdigiY29uZmxpY3Rfc2NvcmUyLmNzdiIpDQoNCiMgc2hvd19jb2wodmlyaWRpc19wYWwoKSgxMCkpDQoNCmZsb29kc19zdG9ybV9zdXJnZSA8LSByZWFkX2V4Y2VsKCJGbG9vZF9BZmZlY3RlZF9Ub3duc2hpcF8oMjAwOC0yMDIxKSAoMSkueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHN0LCB0b3duc2hpcCA9IHRzLCBhZG1pbjFfcGNvZGUgPSBzdF9wY29kZSwgYWRtaW4zX3Bjb2RlID0gdHNfcGNvZGUpICU+JSANCiAgbXV0YXRlKHllYXJfMjAwOF9zdG9ybV9zdXJnZSA9IGlmZWxzZSghaXMubmEoc3Rvcm1fc3VyZyksIDEsIDApKSAlPiUNCiAgbXV0YXRlKHllYXJfMjAwOCA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDA4IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDA5ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMDkiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTAgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxMCIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxMSA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDExIiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDEyID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTIiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTMgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxMyIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxNCA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDE0IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDE1ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTUiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTYgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxNiIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxNyA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDE3IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDE4ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTgiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTkgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxOSIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAyMCA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDIwIiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDIxID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMjEiKSwgMSwgMCkpICU+JQ0KICByZW5hbWUoZmxvb2R5ZWFycyA9IGZsb29kX3llYXIpICU+JSANCiAgbXV0YXRlKA0KICAgIGZsb29kX3Byb2IgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoInllYXJfIikpICU+JSByb3dNZWFucyhuYS5ybSA9IFRSVUUpLA0KICAgIGZsb29kX2NvdW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJ5ZWFyXyIpKSAlPiUgcm93U3VtcyhuYS5ybSA9IFRSVUUpKQ0KDQojIFdlIGNhbiB0cnkgYWdhaW4gbGF0ZXIsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdGhlIHZ1bF9zY29yZQ0KIyBTaW5jZSB3ZSBhcmUgZ29pbmcgaW4gYSBkaWZmZXJlbnQgZGlyZWN0aW9uIA0KdnVsX3NoYXJlIDwtIHZ1bG1tciAlPiUgc2VsZWN0KGF2Z19zYWZlX3Nhbml0YXRpb25faW1wcm92ZWRfZHJpbmtpbmdfd2F0ZXI6ZmVtYWxlX2xpdGVyYWN5X3BlcmNlbnRfbGl0ZXJhdGUsIA0KICAgICAgICAgICAgICAgICAgY2hpbGRfZGVwZW5kZW5jeV9yYXRpb18zMSwgdW5wYWlkX2ZhbWlseV93b3JrZXJfcGVyY2VudCwNCiAgICAgICAgICAgICAgICAgIGFkbWluM19wY29kZSA9IHRvd25zaGlwX3Bjb2RlKSAlPiUgDQogIGxlZnRfam9pbihjb25mbGljdF9zY29yZSAlPiUgc2VsZWN0KGNvbmZsaWN0X3Njb3JlLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHNlbGVjdCgtY29uZmxpY3RfaW5kZXhfY19wZXJjZW50X29mX21heF9pbnZlcnNlX3BlcmNlbnRfb2ZfYXZlcmFnZV9vZl9lbnZlbG9wZXNfMTIsIA0KICAgICAgICAgLXVucGFpZF9mYW1pbHlfd29ya2Vyc19pbnZlcnNlLCAtY2hpbGRfZGVwZW5kZW5jeV9yYXRpb19pbnZlcnNlKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGF2Z19zYWZlX3Nhbml0YXRpb25faW1wcm92ZWRfZHJpbmtpbmdfd2F0ZXI6ZmVtYWxlX2xpdGVyYWN5X3BlcmNlbnRfbGl0ZXJhdGUpLCB+IDEgLSAueCkgJT4lDQogIG11dGF0ZShjb25mbGljdF9lbnYgPSByYW5nZV93bmEoY29uZmxpY3Rfc2NvcmUpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShhZG1pbjNfcGNvZGUpKSAlPiUgIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG1kZXByaXYoYygiYXZnX3NhZmVfc2FuaXRhdGlvbl9pbXByb3ZlZF9kcmlua2luZ193YXRlciIsICJhdmVyYWdlX2dvb2Rfcm9vZl9hbmRfd2FsbCIsIA0KICAgICAgICAgICAgImhpZ2hlc3RfZWR1Y2F0aW9uX2F0X2xlYXN0X21pZGRsZV9zY2hvb2xfcGVyY2VudF8xNCIsICJlbGVjdHJpY2l0eV9mb3JfbGlnaHRpbmdfcGVyY2VudF8xNSIsIA0KICAgICAgICAgICAgImlkX2NhcmRfd2l0aF9pZF90b3RhbF9wZXJjZW50XzE2IiwgImZlbWFsZV9saXRlcmFjeV9wZXJjZW50X2xpdGVyYXRlIiwgDQogICAgICAgICAgICAiY2hpbGRfZGVwZW5kZW5jeV9yYXRpb18zMSIsICJ1bnBhaWRfZmFtaWx5X3dvcmtlcl9wZXJjZW50IiwgImNvbmZsaWN0X2VudiIpLCANCiAgICAgICAgICBtZXRob2QgPSAiY3oiLCBvdXRwdXQgPSAiYWxsIiwgDQogICAgICAgICAgc2NvcmVfaV9oZWFkaW5nID0gInZ1bF9zY29yZSIpDQoNCiMgbWFpbiB0b3duc2hpcC1sZXZlbCBkYXRhc2V0DQpmc19waW4gPC0gcmVhZF9leGNlbCgiaHBjX3Bpbi54bHN4IikgJT4lICANCiAgbGVmdF9qb2luKGZzYyAlPiUgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpLA0KICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNfcGNvZGUiID0gImFkbWluM19wY29kZV9vbGQiKSkgJT4lIA0KICBsZWZ0X2pvaW4oY29uZmxpY3Rfc2NvcmUgJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCBwcm90ZXN0c19hbmRfcmlvdHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X3Njb3JlLCBmYXRhbGl0aWVzKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHZ1bG1tciAlPiUgc2VsZWN0KGFkbWluM19wY29kZSA9IHRvd25zaGlwX3Bjb2RlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluMl9wY29kZSA9IGRpc3RyaWN0X3Bjb2RlLCB0b3RhbF9wb3B1bGF0aW9uXzIwMTUgPSB0b3RhbF9wb3BfYm90aF9zZXhlcywgIA0KICAgICAgICAgICAgICAgICAgICAgYXJlYV9zb3duX2FjcmVzID0gYWxsX2FyZWFfc293ZWRfbWFsaSwgcG9wdWxhdGlvbl9kZW5zaXR5LCB2dWxuZXJhYmlsaXR5X2JhbmQsIA0KICAgICAgICAgICAgICAgICAgICAgb2xkX2NvbmZsaWN0X3Njb3JlID0gY29uZmxpY3RfaW5kZXhfYV9hdmVyYWdlX29mX3BlcmNlbnRfb2ZfdG90YWxzLA0KICAgICAgICAgICAgICAgICAgICAgb2xkX2NvbmZsaWN0X2VudiA9IGNvbmZsaWN0X2luZGV4X2JfYXZlcmFnZV9vZl9lbnZlbG9wZXMsDQogICAgICAgICAgICAgICAgICAgICBhcHByb3hpbWF0ZV92dWxuZXJhYmxlX3BvcHVsYXRpb24gKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKGZsb29kc19zdG9ybV9zdXJnZSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNfcGNvZGUsIGZsb29kX3Byb2IsIGZsb29kX2NvdW50KSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKGZzY18yMDIxICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllc18yMDIxID0gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lcnNfMjAyMSA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKGZzX3BpbiA9IGlmZWxzZShmc19waW4gPiBwb3B1bGF0aW9uXzIwMjFfcHJvaiwgcG9wdWxhdGlvbl8yMDIxX3Byb2osIGZzX3BpbikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGNvbmZsaWN0X3Njb3JlID0gMCwgYmVuZWZpY2lhcmllcyA9IDAsIGJlbmVmaWNpYXJpZXNfMjAyMSA9IDAsIHBhcnRuZXJzXzIwMjEgPSAwLCBmbG9vZF9wcm9iID0gMCkpICU+JSANCiAgbXV0YXRlKGNvbmZsaWN0X3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoY29uZmxpY3Rfc2NvcmUpKSwNCiAgICAgICAgIGZsb29kX3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoZmxvb2RfcHJvYikpLA0KICAgICAgICAgZnNfcGluX3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoZnNfcGluKSksDQogICAgICAgICBmc190YXJnZXRfcmFua2luZyA9IGRlbnNlX3JhbmsoZGVzYyhmc190YXJnZXRlZCkpLA0KICAgICAgICAgZnNfcGluX3BjID0gZnNfcGluIC8gc3VtKGZzX3BpbiksDQogICAgICAgICBwaW5fcG9wID0gZnNfcGluIC8gcG9wdWxhdGlvbl8yMDIxX3Byb2opICU+JSANCiAgbXV0YXRlKG9sZF9ncm91cCA9IGNhc2Vfd2hlbihjb25mbGljdF9zY29yZSA+PSBtZWFuKGNvbmZsaWN0X3Njb3JlKSAmIHBvcHVsYXRpb25fZGVuc2l0eSA+PSAxMDAwIH4gIkExIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X3Njb3JlID49IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5IDwgMTAwMCB+ICJBMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9zY29yZSA8IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5ID49IDEwMDAgfiAiQjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3Rfc2NvcmUgPCBtZWFuKGNvbmZsaWN0X3Njb3JlKSAmIHBvcHVsYXRpb25fZGVuc2l0eSA8IDEwMDAgfiAiQjIiKSkgJT4lIA0KICBtdXRhdGUoYmFuZF90ZXh0ID0gY2FzZV93aGVuKHZ1bG5lcmFiaWxpdHlfYmFuZCA9PSAxIH4gIjEuIEV4dHJlbWUgb3V0bGllcnMsIHVuZGVyZGV2ZWxvcG1lbnQgYW5kIGNvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnVsbmVyYWJpbGl0eV9iYW5kID09IDIgfiAiMi4gQ29uZmxpY3QtYWZmZWN0ZWQsIHBvb3IgaHVtYW4gZGV2ZWxvcG1lbnQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dWxuZXJhYmlsaXR5X2JhbmQgPT0gMyB+ICIzLiBIdWJzIGluIGNvbmZsaWN0LWFmZmVjdGVkIGFyZWFzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnVsbmVyYWJpbGl0eV9iYW5kID09IDQgfiAiNC4gVmVyeSBsb3cgYWNjZXNzIHRvIHNlcnZpY2VzIGFuZCBpbmZyYXN0cnVjdHVyZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlfYmFuZCA9PSA1IH4gIjUuIEFncmljdWx0dXJhbCBhcmVhcyB3aXRoIGhpZ2ggcHJvZml0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlfYmFuZCA9PSA2IH4gIjYuIFNlY29uZGFyeSBjaXRpZXMvdG93bnMgaW4gYWdyaWN1bHR1cmFsIGFyZWFzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnVsbmVyYWJpbGl0eV9iYW5kID09IDcgfiAiNy4gVXAtYW5kLWNvbWluZyBwZXJpLXVyYmFuIGFuZCB1cmJhbiBhcmVhcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlfYmFuZCA9PSA4IH4gIjguIEFmZmx1ZW50LCB1cmJhbiBjb3JlIikpICU+JSANCiAgbGVmdF9qb2luKHZ1bF9zaGFyZSRkYXRhICU+JSAgc2VsZWN0KC1jb25mbGljdF9zY29yZSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICBtdXRhdGUobWRwX3Njb3JlX29sZCA9IChhdmdfc2FmZV9zYW5pdGF0aW9uX2ltcHJvdmVkX2RyaW5raW5nX3dhdGVyICsgYXZlcmFnZV9nb29kX3Jvb2ZfYW5kX3dhbGwgKyANCiAgICAgICAgICAgaGlnaGVzdF9lZHVjYXRpb25fYXRfbGVhc3RfbWlkZGxlX3NjaG9vbF9wZXJjZW50XzE0ICsgZWxlY3RyaWNpdHlfZm9yX2xpZ2h0aW5nX3BlcmNlbnRfMTUgKyANCiAgICAgICAgICAgaWRfY2FyZF93aXRoX2lkX3RvdGFsX3BlcmNlbnRfMTYgKyBmZW1hbGVfbGl0ZXJhY3lfcGVyY2VudF9saXRlcmF0ZSArIA0KICAgICAgICAgICBjaGlsZF9kZXBlbmRlbmN5X3JhdGlvXzMxICsgdW5wYWlkX2ZhbWlseV93b3JrZXJfcGVyY2VudCkgLyA4KSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIDIwMTkgaW50ZXJjZW5zYWwgZGlzdHJpY3QtbGV2ZWwgdmFsdWVzDQpkaXN0cmljdF9yZWYgPC0gZnNfcGluICU+JSAgDQogIHNlbGVjdChzdGF0ZSwgYWRtaW4yX3Bjb2RlLCBhZG1pbjNfcGNvZGUsIHRvdGFsX3BvcHVsYXRpb25fMjAxNSwNCiAgICAgICAgIGF2Z19zYWZlX3Nhbml0YXRpb25faW1wcm92ZWRfZHJpbmtpbmdfd2F0ZXI6dW5wYWlkX2ZhbWlseV93b3JrZXJfcGVyY2VudCkgJT4lIA0KICBncm91cF9ieShhZG1pbjJfcGNvZGUpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYXZnX3NhZmVfc2FuaXRhdGlvbl9pbXByb3ZlZF9kcmlua2luZ193YXRlcjp1bnBhaWRfZmFtaWx5X3dvcmtlcl9wZXJjZW50KSwgDQogICAgICAgICAgICB+IC54ICogdG90YWxfcG9wdWxhdGlvbl8yMDE1KSAlPiUgDQogIHJlbG9jYXRlKHRvdGFsX3BvcHVsYXRpb25fMjAxNSwgLmFmdGVyID0gdW5wYWlkX2ZhbWlseV93b3JrZXJfcGVyY2VudCkgJT4lIA0KICBzdW1tYXJpc2UoYWNyb3NzKGF2Z19zYWZlX3Nhbml0YXRpb25faW1wcm92ZWRfZHJpbmtpbmdfd2F0ZXI6dG90YWxfcG9wdWxhdGlvbl8yMDE1LCB+c3VtKC4pKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhdmdfc2FmZV9zYW5pdGF0aW9uX2ltcHJvdmVkX2RyaW5raW5nX3dhdGVyOnVucGFpZF9mYW1pbHlfd29ya2VyX3BlcmNlbnQpLCANCiAgICAgICAgICAgIH4gLnggLyB0b3RhbF9wb3B1bGF0aW9uXzIwMTUpICU+JSANCiAgbGVmdF9qb2luKA0KICAgIHJlYWRfZXhjZWwoDQogICAgICAiRGF0YXNldF9DbGltYXRlLCBFbnZpcm9ubWVudGFsIERlZ3JhZGF0aW9uIGFuZCBEaXNhc3RlciBSaXNrIGluIE15YW5tYXJfTWF5MjAyMi54bHN4IiwNCiAgICAgIHNraXAgPSAyLA0KICAgICAgc2hlZXQgPSAiMjAxNi0yMSBWdWxuZXJhYmlsaXR5Ig0KICAgICkgJT4lDQogICAgICBzbGljZSgtMSkgJT4lDQogICAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgICAgc2VsZWN0KC1sYWJlbCkgJT4lICANCiAgcmVuYW1lKHN0YXRlID0gc3RhdGVfcmVnaW9uX25hbWUsIGFkbWluMV9wY29kZSA9IHN0YXRlX3JlZ2lvbl9wY29kZSwgDQogICAgICAgICBkaXN0cmljdCA9IGRpc3RyaWN0X25hbWUsIGFkbWluMl9wY29kZSA9IGRpc3RyaWN0X3Bjb2RlKSAlPiUNCiAgICAgIHNlbGVjdChhZG1pbjJfcGNvZGUsIGF2Z19zYWZlX3Nhbml0YXRpb25faW1wcm92ZWRfZHJpbmtpbmdfd2F0ZXJfMjE6ZmVtYWxlX2xpdGVyYWN5X3BlcmNlbnRfbGl0ZXJhdGVfMjkpICU+JSANCiAgICAgIHNlbGVjdCgtY29uZmxpY3RfaW5kZXhfY19wZXJjZW50X29mX21heF9pbnZlcnNlX3BlcmNlbnRfb2ZfYXZlcmFnZV9vZl9lbnZlbG9wZXNfMjMpICU+JSANCiAgICAgIG5hLm9taXQoKSAlPiUgDQogICAgICBtdXRhdGVfYXQodmFycyhhdmdfc2FmZV9zYW5pdGF0aW9uX2ltcHJvdmVkX2RyaW5raW5nX3dhdGVyXzIxOmZlbWFsZV9saXRlcmFjeV9wZXJjZW50X2xpdGVyYXRlXzI5KSwgfiBhcy5udW1lcmljKC54KSkgJT4lIA0KICAgICAgbXV0YXRlX2F0KHZhcnMoYXZnX3NhZmVfc2FuaXRhdGlvbl9pbXByb3ZlZF9kcmlua2luZ193YXRlcl8yMTpmZW1hbGVfbGl0ZXJhY3lfcGVyY2VudF9saXRlcmF0ZV8yOSksIH4gMSAtIC54KSwgDQogICAgYnkgPSAiYWRtaW4yX3Bjb2RlIikgJT4lIA0KICBzZWxlY3QoYWRtaW4yX3Bjb2RlLCANCiAgICAgICAgIGRfd2F0ZXJfMjAxNSA9IGF2Z19zYWZlX3Nhbml0YXRpb25faW1wcm92ZWRfZHJpbmtpbmdfd2F0ZXIsIA0KICAgICAgICAgZF9ob3VzZV8yMDE1ID0gYXZlcmFnZV9nb29kX3Jvb2ZfYW5kX3dhbGwsIA0KICAgICAgICAgZF9lbGVjdHJpY2l0eV8yMDE1ID0gZWxlY3RyaWNpdHlfZm9yX2xpZ2h0aW5nX3BlcmNlbnRfMTUsIA0KICAgICAgICAgZF9saXRlcmFjeV8yMDE1ID0gZmVtYWxlX2xpdGVyYWN5X3BlcmNlbnRfbGl0ZXJhdGUsIA0KICAgICAgICAgZF9jaGlsZF8yMDE1ID0gY2hpbGRfZGVwZW5kZW5jeV9yYXRpb18zMSwgDQogICAgICAgICBkX3VucGFpZF8yMDE1ID0gdW5wYWlkX2ZhbWlseV93b3JrZXJfcGVyY2VudCwgDQogICAgICAgICBkX3dhdGVyXzIwMTkgPSBhdmdfc2FmZV9zYW5pdGF0aW9uX2ltcHJvdmVkX2RyaW5raW5nX3dhdGVyXzIxLCANCiAgICAgICAgIGRfaG91c2VfMjAxOSA9IGF2ZXJhZ2VfZ29vZF9yb29mX2FuZF93YWxsXzIyICAsIA0KICAgICAgICAgZF9lbGVjdHJpY2l0eV8yMDE5ID0gZWxlY3RyaWNpdHlfZm9yX2xpZ2h0aW5nX3BlcmNlbnRfMjYsIA0KICAgICAgICAgZF9saXRlcmFjeV8yMDE5ID0gZmVtYWxlX2xpdGVyYWN5X3BlcmNlbnRfbGl0ZXJhdGVfMjksIA0KICAgICAgICAgZF9jaGlsZF8yMDE5ID0gY2hpbGRfZGVwZW5kZW5jeV9yYXRpb19pbnZlcnNlXzI4LCANCiAgICAgICAgIGRfdW5wYWlkXzIwMTkgPSB1bnBhaWRfZmFtaWx5X3dvcmtlcnNfaW52ZXJzZV8yNCkgDQoNCiMgd3JpdGUgaXQgYmFjayBpbnRvIGZzX3BpbiANCmZzX3BpbiA8LSBmc19waW4gJT4lIA0KICBsZWZ0X2pvaW4oZGlzdHJpY3RfcmVmLCBieSA9ICJhZG1pbjJfcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3YXRlcl8yMDE5ID0gaWZlbHNlKCFpcy5uYShkX3dhdGVyXzIwMTkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3NhZmVfc2FuaXRhdGlvbl9pbXByb3ZlZF9kcmlua2luZ193YXRlciAvIGRfd2F0ZXJfMjAxNSAqIGRfd2F0ZXJfMjAxOSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc2FmZV9zYW5pdGF0aW9uX2ltcHJvdmVkX2RyaW5raW5nX3dhdGVyKSwgDQogICAgICAgICBob3VzZV8yMDE5ID0gaWZlbHNlKCFpcy5uYShkX2hvdXNlXzIwMTkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VfZ29vZF9yb29mX2FuZF93YWxsIC8gZF9ob3VzZV8yMDE1ICogZF93YXRlcl8yMDE5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VfZ29vZF9yb29mX2FuZF93YWxsKSwgDQogICAgICAgICBlZHVfMjAxOSA9IGhpZ2hlc3RfZWR1Y2F0aW9uX2F0X2xlYXN0X21pZGRsZV9zY2hvb2xfcGVyY2VudF8xNCwgDQogICAgICAgICBlbGVjdHJpY2l0eV8yMDE5ID0gaWZlbHNlKCFpcy5uYShkX2VsZWN0cmljaXR5XzIwMTkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3RyaWNpdHlfZm9yX2xpZ2h0aW5nX3BlcmNlbnRfMTUgLyBkX2VsZWN0cmljaXR5XzIwMTUgKiBkX2VsZWN0cmljaXR5XzIwMTksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3RyaWNpdHlfZm9yX2xpZ2h0aW5nX3BlcmNlbnRfMTUpLCANCiAgICAgICAgIGlkX2NhcmRfMjAxOSA9IGlkX2NhcmRfd2l0aF9pZF90b3RhbF9wZXJjZW50XzE2LCANCiAgICAgICAgIGZlbWFsZV9saXRlcmFjeV8yMDE5ID0gaWZlbHNlKCFpcy5uYShkX2xpdGVyYWN5XzIwMTkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbWFsZV9saXRlcmFjeV9wZXJjZW50X2xpdGVyYXRlIC8gZF9saXRlcmFjeV8yMDE1ICogZF9saXRlcmFjeV8yMDE5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtYWxlX2xpdGVyYWN5X3BlcmNlbnRfbGl0ZXJhdGUpLCANCiAgICAgICAgIGNoaWxkX2RlcGVuZGVuY3lfMjAxOSA9IGlmZWxzZSghaXMubmEoZF9jaGlsZF8yMDE5KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfZGVwZW5kZW5jeV9yYXRpb18zMSAvIGRfY2hpbGRfMjAxNSAqIGRfY2hpbGRfMjAxOSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfZGVwZW5kZW5jeV9yYXRpb18zMSksIA0KICAgICAgICAgdW5wYWlkXzIwMTkgPSBpZmVsc2UoIWlzLm5hKGRfdW5wYWlkXzIwMTkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWlkX2ZhbWlseV93b3JrZXJfcGVyY2VudCAvIGRfdW5wYWlkXzIwMTUgKiBkX3VucGFpZF8yMDE5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFpZF9mYW1pbHlfd29ya2VyX3BlcmNlbnQpKSAlPiUgDQogIG11dGF0ZShtZHBfYWRqdXN0ID0gKHdhdGVyXzIwMTkgKyBob3VzZV8yMDE5ICsgZWR1XzIwMTkgKyBlbGVjdHJpY2l0eV8yMDE5ICsgDQogICAgICAgICAgICAgICAgICAgICAgIGlkX2NhcmRfMjAxOSArIGZlbWFsZV9saXRlcmFjeV8yMDE5ICsgY2hpbGRfZGVwZW5kZW5jeV8yMDE5ICsgdW5wYWlkXzIwMTkpIC8gOCkgJT4lIA0KICB1bmdyb3VwKCkNCg0KIyBrLW1lYW5zIGNsdXN0ZXJpbmcgYW5kIG91dHB1dA0Kc2V0LnNlZWQoMTIzKQ0KDQprbV9yZXMyIDwtIGZzX3BpbiAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChmYXRhbGl0aWVzID0gMCkpICU+JSANCiAgc2VsZWN0KHBvcHVsYXRpb25fZGVuc2l0eSwgY29uZmxpY3Rfc2NvcmUsIG1kcF9hZGp1c3QsIGZhdGFsaXRpZXMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhwb3B1bGF0aW9uX2RlbnNpdHksIGNvbmZsaWN0X3Njb3JlLCBtZHBfYWRqdXN0LCBmYXRhbGl0aWVzKSwgfiByYW5nZV93bmEoLngpKSAlPiUgDQogIGttZWFucyg1LCBuc3RhcnQgPSAyNSkNCg0KIyByZWFkaW5nIGl0IGJhY2sgaW50byBmc19waW4NCmZzX3BpbiA8LSBmc19waW4gJT4lIA0KICBjYmluZChjbHVzdGVyID0ga21fcmVzMiRjbHVzdGVyKSAlPiUgDQogIG11dGF0ZShjbHVzdGVyID0gcmVjb2RlKGNsdXN0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSAiQTEiLGA0YCA9ICJBMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiQiIsIGAzYCA9ICJDIiwgYDVgID0gIkQiKSkNCg0KYGBgDQoNCg0KYGBge3IgZGYtZmFvLXdmcC1zdXJ2ZXl9DQoNCiMgc2hvdWxkIGkganVzdCByZWFkIGluIHRoZSB3aG9sZSBzdXJ2ZXkgZGF0YXNldCBoZXJlPyBvciBqdXN0IHJlYWQgaW4gdGhlIGNzdg0KIyBpIGRvbid0IHJlYWxseSBrbm93IGlmIHBlb3BsZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgY2xlYW5pbmcgcHJvY2Vzcw0KDQpmYW9fc3VydmV5IDwtIHJlYWRfZHRhKCJNTVJfUjJIUV9jbGVhbmVkV3RfZmluYWwuZHRhIikgJT4lIA0KICB6YXBfbGFiZWxzKCkNCg0Kc3VydmV5IDwtIGZhb19zdXJ2ZXkgJT4lIA0KICByZW5hbWUoYWRtaW4zX3Bjb2RlID0gYWRtM19wY29kZSkgJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGVzICU+JSBzZWxlY3QoYWRtaW4zX3Bjb2RlLCB0b3duc2hpcCwgc3RhdGUsIGFkbWluMV9wY29kZSwgZGlzdHJpY3QsIGFkbWluMl9wY29kZSksDQogICAgICAgICAgICBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNzX3N0cmVzc19oaF9hc3NldHM6Y3NfZW1lcmdlbmN5X2hoX3Jpc2spLCANCiAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSA0IH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19zdHJlc3NfaGhfYXNzZXRzOmNzX2VtZXJnZW5jeV9oaF9yaXNrKSwgDQogICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gMSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgIC4gPT0gMiB+IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAuID09IDEgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUNCiAgbXV0YXRlKGxoY3NpX21heCA9IGNhc2Vfd2hlbihsaGNzaV9tYXhfYWcgPT0gIk5vbmUiIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaGNzaV9tYXhfYWcgPT0gIlN0cmVzcyIgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoY3NpX21heF9hZyA9PSAiQ3Jpc2lzIiB+IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhjc2lfbWF4X2FnID09ICJFbWVyZ2VuY3kiIH4gMyksDQogICAgICAgICAgICAgICAgICBsaGNzaV9yYW5nZSA9IHJhbmdlMDEobGhjc2lfbWF4KSkgJT4lDQogIG11dGF0ZShjc2lfd2VpZ2h0ZWQgPSAoY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMgKyBjc19jcmlzaXNfbm9fc2Nob29sICsgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCkgKiAwLjUgKyANCiAgICAgICAgICAgKGNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlICsgY3NfZW1lcmdlbmN5X2hoX21pZ3JhdGlvbiArIGNzX2VtZXJnZW5jeV9oaF9yaXNrKSAqIDEsDQogICAgICAgICBjc2lfd2VpZ2h0ZWQgPSByYW5nZV93bmEoY3NpX3dlaWdodGVkKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhoaF9nZW5kZXIsIGZld2Zvb2QsIHNraXBwZWQsIHdobGRheSwgaHVuZ3J5LCBhdGVsZXNzLCBoZWFsdGh5LCBydW5vdXQsIHdvcnJpZWQsIA0KICAgICAgICAgICAgICAgICBjcnBfc2FsZXNkaWYsIGFjY2Vzc21hcmtldCwgbmVlZCwgY3JwX3Byb2RkaWYsIGNyb3BkaWZmaWN1bHR5dW5yZXN0LCBjcm9wc2FsZXNkaWZmaWN1bHR5dW5yZXN0KSwgDQogICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gMyB+IE5BX3JlYWxfLCANCiAgICAgICAgICAgICAgICAgICAgICAgLiA9PSA0IH4gTkFfcmVhbF8sIA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpICU+JSANCiAgbXV0YXRlKGhvaF9mZW1hbGUgPSBjYXNlX3doZW4oaGhfZ2VuZGVyID09IDEgfiAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfZ2VuZGVyID09IDIgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gaGhfZ2VuZGVyKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGZpZXNfZmV3Zm9vZCA9IGZld2Zvb2QsIGZpZXNfc2tpcHBlZCA9IHNraXBwZWQsIA0KICAgICAgICAgICAgICAgICBmaWVzX3dobGRheSA9IHdobGRheSwgZmllc19odW5ncnkgPSBodW5ncnksDQogICAgICAgICAgICAgICAgIGZpZXNfYXRlbGVzcyA9IGF0ZWxlc3MsIGZpZXNfaGVhbHRoeSA9IGhlYWx0aHksDQogICAgICAgICAgICAgICAgIGZpZXNfcnVub3V0ID0gcnVub3V0LCBmaWVzX3dvcnJpZWQgPSB3b3JyaWVkLA0KICAgICAgICAgICAgICAgICBhY2Nlc3NtYXJrZXQsIG5lZWQsIGNycF9zYWxlc2RpZiwgY3JwX3Byb2RkaWYsDQogICAgICAgICAgICAgICAgIGNyb3BkaWZmaWN1bHR5dW5yZXN0LCBjcm9wc2FsZXNkaWZmaWN1bHR5dW5yZXN0KSwNCiAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSAxIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgIC4gPT0gMiB+IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JQ0KICBtdXRhdGUobm9fYWNjZXNzbWFya2V0ID0gaWZlbHNlKGFjY2Vzc21hcmtldCA9PSAxLCAwLCAxKSkgJT4lIA0KICAjIGJlIGNhcmVmdWwgaGVyZSAtLSB5b3UndmUgaW1wdXRlZCBtaXNzaW5nIGZpZXMgZGF0YSBhcyAwDQogICMgdGhpcyBpcyB0aGUgZmllcyByYXcgc2NvcmUsIG5vdCBzdXJlIGlmIGkgbmVlZCBhbnkgYWRkaXRpb25hbCB0cmFuc2Zvcm1hdGlvbnMgYXQgdGhlIGhoZCBsZXZlbA0KICBtdXRhdGUoZmllc19yYXcgPSBmaWVzX2Zld2Zvb2QgKyBmaWVzX3NraXBwZWQgKyBmaWVzX3dobGRheSArIGZpZXNfaHVuZ3J5ICsNCiAgICAgICAgICAgZmllc19hdGVsZXNzICsgZmllc19oZWFsdGh5ICsgZmllc19ydW5vdXQgKyBmaWVzX3dvcnJpZWQsIA0KICAgICAgICAgZmllc19yYXdfcmFuZ2UgPSByYW5nZV93bmEoZmllc19yYXcpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGhoX3dlYWx0aF90b2lsZXQsIGhoX3Jlc2lkZW5jZXR5cGUsIGhoX2VkdWNhdGlvbiwNCiAgICAgICAgICAgICAgICAgaW5jb21lX21haW5fY29tcCwgaW5jb21lX3NlY19jb21wLCBpbmNvbWVfdGhpcmRfY29tcCwgDQogICAgICAgICAgICAgICAgIGNycF9hcmVhX2NoYW5nZSwgY3JwX2hhcnZfY2hhbmdlLCBjcnBfc2FsZXNwcmljZSksDQogICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gNiB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAuID09IDcgfiBOQV9yZWFsXywgDQogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhpbmNvbWVfbWFpbl9jb21wLCBpbmNvbWVfc2VjX2NvbXAsIGluY29tZV90aGlyZF9jb21wLCANCiAgICAgICAgICAgICAgICAgY3JwX2FyZWFfY2hhbmdlLCBjcnBfaGFydl9jaGFuZ2UsIGNycF9zYWxlc3ByaWNlKSwNCiAgICAgICAgICAgIH5yYW5nZV93bmEoLikpICU+JSAgIA0KICBtdXRhdGUobm90X2ltcHJvdmVkX3Nhbml0YXRpb24gPSBjYXNlX3doZW4oaGhfd2VhbHRoX3RvaWxldCA9PSAxIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF93ZWFsdGhfdG9pbGV0ID09IDIgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3dlYWx0aF90b2lsZXQgPT0gMyB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfd2VhbHRoX3RvaWxldCA9PSA0IH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF93ZWFsdGhfdG9pbGV0ID09IDUgfiAxKSkgJT4lIA0KICBtdXRhdGUocmVzaWRlbmNlX3R5cGUgPSBjYXNlX3doZW4oaGhfcmVzaWRlbmNldHlwZSA9PSAxIH4gInJlc2lkZW5jZV9wZXJtYW5lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfcmVzaWRlbmNldHlwZSA9PSAyIH4gInJlc2lkZW5jZV9yZWNlbnRfbWlncmFudCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9yZXNpZGVuY2V0eXBlID09IDMgfiAicmVzaWRlbmNlX3JldHVybmVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3Jlc2lkZW5jZXR5cGUgPT0gNCB+ICJyZXNpZGVuY2VfaWRwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3Jlc2lkZW5jZXR5cGUgPT0gNSB+ICJyZXNpZGVuY2VfcmVmdWdlZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUgDQogIG11dGF0ZShob2hfZWR1Y2F0aW9uID0gY2FzZV93aGVuKGhoX2VkdWNhdGlvbiA9PSAxIH4gImVkdV9ub25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfZWR1Y2F0aW9uID09IDIgfiAiZWR1X3ByaW1hcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9lZHVjYXRpb24gPT0gMyB+ICJlZHVfc2Vjb25kYXJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfZWR1Y2F0aW9uID09IDQgfiAiZWR1X2hpZ2hlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2VkdWNhdGlvbiA9PSA1IH4gImVkdV9yZWxpZ2lvdXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykpICU+JQ0KICBtdXRhdGVfYXQodmFycyhoaF9hZ2UsIGluY29tZWNoYW5nZXJlZHVjZWQsIHdoZXJlbWlncmF0aW9uLCBtZWFscywgaGhfYWdyaWNhY3Rpdml0eSksDQogICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gNSB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAuID09IDYgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IC4pKSAlPiUgDQogIG11dGF0ZShob2hfYWdlID0gY2FzZV93aGVuKGhoX2FnZSA9PSAxIH4gImFnZV91bmRlcjE4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfYWdlID09IDIgfiAiYWdlXzE4XzQwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfYWdlID09IDMgfiAiYWdlXzQxXzY1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfYWdlID09IDQgfiAiYWdlX292ZXI2NSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lIA0KICAgIG11dGF0ZShtZWFsc19pbnYgPSBjYXNlX3doZW4obWVhbHMgPT0gNCB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYWxzID09IDMgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYWxzID09IDIgfiAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFscyA9PSAxIH4gNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gbWVhbHMpLA0KICAgICAgICAgbWVhbHNfaW52ID0gcmFuZ2Vfd25hKG1lYWxzX2ludikpICU+JSANCiAgbXV0YXRlKGluY29tZV9yZWR1Y2VkID0gY2FzZV93aGVuKGluY29tZWNoYW5nZXJlZHVjZWQgPT0gNCB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVjaGFuZ2VyZWR1Y2VkID09IDMgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lY2hhbmdlcmVkdWNlZCA9PSAyIH4gMywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVjaGFuZ2VyZWR1Y2VkID09IDEgfiA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGluY29tZWNoYW5nZXJlZHVjZWQpLA0KICAgICAgICAgaW5jb21lX3JlZHVjZWQgPSByYW5nZV93bmEoaW5jb21lX3JlZHVjZWQpKSAlPiUgDQogICMgeW91J3ZlIGNoYW5nZWQgYWxsIHRoZSBOQXMgaW4gYWdyaWFjdGl2aXR5IHRvIDANCiAgbXV0YXRlKGFncmlfYWN0aXZpdHkgPSBjYXNlX3doZW4oaGhfYWdyaWNhY3Rpdml0eSAlaW4lIGMoMSwgMiwgMykgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lDQogICMgZmllcyBpbmRpY2F0b3JzICAgICANCiAgbXV0YXRlX2F0KHZhcnMoZmllc19yYW5vdXRfaGhzLCBmaWVzX2h1bmdyeV9oaHMsIGZpZXNfd2hsZGF5X2hocyksDQogICAgICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDQgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gPT0gNSB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IC4pKSAlPiUgDQogICAgICBtdXRhdGVfYXQodmFycyhmaWVzX2h1bmdyeV9oaHMsIGZpZXNfcmFub3V0X2hocywgZmllc193aGxkYXlfaGhzKSwNCiAgICAgICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gMyB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLiA9PSAyIH4gMC41LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gPT0gMSB+IDAuMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IC4pKSAlPiUNCiAgbXV0YXRlKGV4cGVuc2Vmb29kMzBkID0gY2FzZV93aGVuKGV4cGVuc2Vmb29kMzBkID09IDExIH4gTkFfcmVhbF8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVuc2Vmb29kMzBkID09IDEyIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGV4cGVuc2Vmb29kMzBkKSkgJT4lIA0KICAgICAgbXV0YXRlKGV4cGVuc2VfZm9vZCA9IGV4cGVuc2Vmb29kMzBkIC8gMTApICU+JQ0KICAgICAgIyBmY3MgaW5kaWNhdG9ycw0KICBtdXRhdGUoaGhmY3NfaW52ID0gMTEyIC0gSEhGQ1MsDQogICAgICAgICBoaGZjc19pbnYgPSByYW5nZV93bmEoaGhmY3NfaW52KSwNCiAgICAgICAgIGZjc19ib3JkZXJsaW5lX3Bvb3IgPSBpZmVsc2UoSEhGQ1MgPD0gMzUsIDEsIDApKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoZmNzc3RhcCwgZmNzcHVsc2UsIGZjc2RhaXJ5LCBmY3NwciwgZmNzdmVnLCBmY3NmcnVpdCwgZmNzZmF0LCBmY3NzdWdhciksDQogICAgICAgICAgICAgICAgfiByYW5nZV93bmEoNyAtIC4pKSAlPiUNCiAgcmVuYW1lX3dpdGgoc3RyX3JlcGxhY2UsIHBhdHRlcm4gPSAiZmNzIiwgcmVwbGFjZW1lbnQgPSAiZmNzXyIsIG1hdGNoZXMoImZjcyIpKSAlPiUgIA0KICByZW5hbWUoZmNzX3Byb3RlaW4gPSBmY3NfcHIsIGZjc19zdGFwbGUgPSBmY3Nfc3RhcCwgaGhmY3NfaW52ID0gaGhmY3NfX2ludiwgDQogICAgICAgICBmY3NfYm9yZGVybGluZV9wb29yID0gZmNzX19ib3JkZXJsaW5lX3Bvb3IpICU+JSANCiAgbXV0YXRlKGluY29tZV9zb3VyY2UgPSBjYXNlX3doZW4oaW5jb21lX21haW4gJWluJSBjKDEsIDIsIDMsIDcsIDgsIDksIDEwKSB+ICJpbmNvbWVfbXNfYWdyaWN1bHR1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA0IH4gImluY29tZV9tc19saXZlc3RvY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA1IH4gImluY29tZV9tc19maXNoZXJpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTEsIDEzLCAxNCkgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoNiwgMTIpIH4gImluY29tZV9tc19jYXN1YWxfbm9uX2FnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX21haW4gJWluJSBjKDE1LCAxNiwgMTcsIDE4KSB+ICJpbmNvbWVfbXNfc2VsZmVtX25vbndvcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTksIDIwKSB+ICJpbmNvbWVfbXNfbm9faW5jb21lIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciKSkgJT4lDQogIGxlZnRfam9pbihmYW9fc3VydmV5ICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGluY29tZV9zb3VyY2UgPSBjYXNlX3doZW4oaW5jb21lX21haW4gJWluJSBjKDEsIDIsIDMsIDcsIDgsIDksIDEwKSB+ICJpbmNvbWVfbXNfYWdyaWN1bHR1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA0IH4gImluY29tZV9tc19saXZlc3RvY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA1IH4gImluY29tZV9tc19maXNoZXJpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTEsIDEzLCAxNCkgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoNiwgMTIpIH4gImluY29tZV9tc19jYXN1YWxfbm9uX2FnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX21haW4gJWluJSBjKDE1LCAxNiwgMTcsIDE4KSB+ICJpbmNvbWVfbXNfc2VsZmVtX25vbndvcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTksIDIwKSB+ICJpbmNvbWVfbXNfbm9faW5jb21lIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciKSkgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChzdXJ2ZXlfaWQsIGluY29tZV9zb3VyY2UpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUodmFsdWUgPSAxKSAlPiUNCiAgICAgICAgICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluY29tZV9zb3VyY2UsIHZhbHVlc19mcm9tID0gdmFsdWUsIHZhbHVlc19maWxsID0gMCksDQogICAgICAgICAgICBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogICAgICAjIGltcHV0ZWQgaW5jb21lX21haW5fZ3JvdXAgdmFsdWUgLS0gbG9vayBhdCB0aGUgIm1heWJlX2xhdGVyIiBiZWxvdyB0byBzZWUgaG93IGl0IHdhcyBkb25lDQogICAgICBtdXRhdGUocnVyYWwgPSBpZmVsc2UocnVyYWx1cmJhbiA9PSAxLCAxLCAwKSkgJT4lIA0KICAgICAgIyBpbXB1dGVkIGhvaCBzZXggLS0gbW9kZQ0KICAgICAgbXV0YXRlKGhvaF9mZW1hbGUgPSBpZmVsc2UoaXMubmEoaG9oX2ZlbWFsZSksIDAsIGhvaF9mZW1hbGUpKSAlPiUgDQogICAgICAjIGltcHV0ZWQgZmllc19yYW5vdXRfaGhzIC0tIG1vZGUNCiAgICAgIG11dGF0ZShmaWVzX3Jhbm91dF9oaHMgPSBpZmVsc2UoaXMubmEoZmllc19yYW5vdXRfaGhzKSwgMSwgZmllc19yYW5vdXRfaGhzKSkgJT4lICANCiAgbXV0YXRlKHNob2Nrc19ub25lID0gc2hvY2tfbm9zaG9jaywNCiAgICAgICAgIHNob2Nrc19sb3N0d29yayA9IHNob2NrX2xvc3RlbXBsb3J3b3JrLCANCiAgICAgICAgIHNob2Nrc19zaWNrbmVzc2RlYXRoID0gc2hvY2tfc2lja25lc3NvcmRlYXRob2ZoaCwgDQogICAgICAgICBzaG9ja3NfZm9vZHByaWNlcyA9IHNob2NrX2hpZ2hlcmZvb2RwcmljZXMsIA0KICAgICAgICAgc2hvY2tzX2NvbmZsaWN0ID0gc2hvY2tfdmlvbGVuY2VpbnNlY2NvbmYsIA0KICAgICAgICAgc2hvY2tzX2NhbnR3b3JrYnVzaW5lc3MgPSBzaG9ja19jYW50d29ya29yZG9idXNpbmVzcywgDQogICAgICAgICBzaG9ja3NfbmF0dXJhbGhhemFyZCA9IGlmZWxzZShzaG9ja19mbG9vZCA+IDAgfCBzaG9ja19kcm91Z2h0ID4gMCB8IHNob2NrX2h1cnJpY2FuZSA+IDAgfCBzaG9ja19sYW5kc2xpZGVzID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX2ZpcmVuYXR1cmFsID4gMCB8IHNob2NrX290aGVybmF0aGF6YXJkID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX2NvbGR0ZW1wb3JoYWlsID4gMCwgMSwgMCksDQogICAgICAgICBzaG9ja3NfYWNjZXNzbWFya2V0ID0gc2hvY2tfbmFwYXN0dXJlLCANCiAgICAgICAgIHNob2Nrc19wcmljZXNvdGhlciA9IGlmZWxzZShzaG9ja19oaWdoZXJhZ3JpbnB1dHByaWNlID4gMCB8IHNob2NrX2hpZ2hlcmZ1ZWxwcmljZXMgPiAwIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ja19vdGhlcmVjb25vbWljc2hvY2sgPiAwIHwgc2hvY2tfbG93b3V0cHV0cHJpY2UgPiAwLCAxLCAwKSwgDQogICAgICAgICBzaG9ja3Nfb3RoZXIgPSBpZmVsc2Uoc2hvY2tfb3RoZXJjcm9wYW5kbGl2ZXN0cyA+IDAgfCBzaG9ja19vdGhlcmludHJhaGhzaG9jayA+IDAgfCBzaG9ja19vdGhlcm1hbm1hZGVoYXphcmQgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX2FuaW1hbGRpc2Vhc2UgPiAwIHwgc2hvY2tfcGVzdG91dGJyZWFrID4gMCB8IHNob2NrX3BsYW50ZGlzZWFzZSA+IDAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX290aGVyY3JvcGFuZGxpdmVzdHMgPiAwIHwgc2hvY2tfb3RoZXJpbnRyYWhoc2hvY2sgPiAwIHwgc2hvY2tfdGhlZnRvZnByb2Rhc3NldHMgPiAwICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGluY29tZV9tYWluX2Ftb3VudCA9IDAsIGluY29tZV9zZWNfYW1vdW50ID0gMCwgaW5jb21lX3RoaXJkX2Ftb3VudCA9IDApKSAlPiUgDQogIG11dGF0ZShpbmNvbWVfdG90YWxfYW1vdW50ID0gaW5jb21lX21haW5fYW1vdW50ICsgaW5jb21lX3NlY19hbW91bnQgKyBpbmNvbWVfdGhpcmRfYW1vdW50LA0KICAgICAgICAgZm9vZF9leHBlbnNlc19tbWsgPSBpbmNvbWVfdG90YWxfYW1vdW50ICogZXhwZW5zZV9mb29kLCANCiAgICAgICAgIGluY29tZV9wZXJfY2FwaXRhID0gaW5jb21lX3RvdGFsX2Ftb3VudCAvIGhoX3NpemUpICU+JQ0KICBtdXRhdGUobmVlZHNfZm9vZCA9IGlmZWxzZShuZWVkX2Zvb2QgPiAwLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX2Nhc2ggPSBpZmVsc2UobmVlZF9jYXNoYXNzaXN0YW5jZSA+IDAsIDEsIDApLA0KICAgICAgICAgbmVlZHNfbWVkaWNhbCA9IGlmZWxzZShuZWVkX21lZGljYWxzZXJ2aWNlc3VwcGx5ID4gMCwgMSwgMCksDQogICAgICAgICBuZWVkc19hZ3JpID0gaWZlbHNlKG5lZWRfZmVydGlsaXplcnMgPiAwIHwgbmVlZF9wZXN0aWNpZGVzID4gMCB8IG5lZWRfdGVjaHN1cHBvcmV4dGVuc2lvbnNlcnYgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2Fjc3RvbWVjaGFuaXNlZGVxdWlwcHJvZCA+IDB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hY2Nlc3N0b2xhbmQgPiAwIHwgbmVlZF9zZWVkcyA+IDAgfCBuZWVkX2xhbmRyZWhhYmlsaXRhdGlvbiA+IDAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2FjY2Vzc3RvaXJyaWdhdGlvbndhdGVyID4gMCB8IG5lZWRfc3VwcG9ydGZvcnByb2Nlc3Nwcm9kID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hZ3JpbGFib3VyLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX2pvYnNsb2FucyA9IGlmZWxzZShuZWVkX2xvYW5zID4gMCB8IG5lZWRfam9ib3Bwb3J0dW5pdHkgPiAwLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX290aGVyID0gaWZlbHNlKG5lZWRfY2xvdGhlc3NoZWx0ZXJ3YXRlciA+IDAgfCBuZWVkX2VkdWNhdGlvbmFzc2lzdGFuY2UgPiAwIHwgbmVlZF9maXNoZXF1aW9yb3RoZXJzdXBwZm9yID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfaW5mb29uc2FmZXR5bWVhc3VyZXMgPiAwIHwgbmVlZF9tYXJrZXRpbmdzdXBwb3J0ID4gMCB8IG5lZWRfb3RoZXIgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9zdG9yYWdlZXF1aXBtZW50b3JmYWNpID4gMCB8IG5lZWRfdG9vbHMgPiAwIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfcmVzdG9ja2luZ2FuaW1hbHMgPiAwIHwgbmVlZF92ZXRlcmluYXJ5c2VydmljZXMgPiAwIHwgbmVlZF9hbmltYWxmZWVkID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfYW5pbWFsc2FsZW1pbmdhcmFudGRwcmljZSA+IDAgfCBuZWVkX3N1cHB0cmFuc29mYW5pbWFsc29ycHJvZCA+IDAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3NwZWNpYWxudXRyaXRpb25mb29kID4gMCwgMSwgMCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KG5lZWRzX2Zvb2QgPSAwLCBuZWVkc19jYXNoID0gMCwgbmVlZHNfbWVkaWNhbCA9IDAsIG5lZWRzX2FncmkgPSAwLCANCiAgICAgICAgICAgICAgICAgIG5lZWRzX2pvYnNsb2FucyA9IDAsIG5lZWRzX290aGVyID0gMCkpICU+JSANCiAgc2VsZWN0KC1jKHNob2NrX290aGVyc3BlY2lmeSwgY292aWRfb3RoZXJzcGVjaWZ5LHNob2NrX3JlZiwgY292aWRfcmVmLCBzaG9ja19kaywgY292aWRfZGssIA0KICAgICAgICAgICAgY3JwX3Byb2RkaWZfb3RoZXJzcGVjaWZ5LCBjcnBfc2FsZWRpZl9vdGhlcnNwZWNpZnksIGxzX251bV9pbmNfZGVjX290aGVyc3BlY2lmeSwgDQogICAgICAgICAgICBsc19mb29kX3N1cHBseV9vdGhlcnNwZWNpZnksIGxzX3Byb2RkaWZfb3RoZXJzcGVjaWZ5LCBuZWVkX2RrLCBuZWVkX290aGVyc3BlY2lmeSwNCiAgICAgICAgICAgIGxzX3NhbGVzZGlmX290aGVyc3BlY2lmeSwgZmlzaF9zYWxlZGlmX290aGVyc3BlY2lmeSwgcmVhc29uc21pZ3JhdGlvbl9vdGhlcnNwZWNpZnksDQogICAgICAgICAgICBhZG0zX2F5ZXlhcndhZHksIGFkbTNfY2hpbiwgYWRtM19rYWNoaW4sIGFkbTNfa2F5YWgsIGFkbTNfa2F5YWgsIGFkbTNfa2F5aW4sDQogICAgICAgICAgICBhZG0zX3Jha2hpbmUsIGFkbTNfc2hhbl9lYXN0LCBhZG0zX3NoYW5fbm9ydGgsIGFkbTNfeWFuZ29uLCBhZG0zX21vbikpICU+JSAgDQogIG11dGF0ZShmb29kX2V4cGVuc2VzX3Blcl9jYXBpdGEgPSBmb29kX2V4cGVuc2VzX21tayAvIGhoX3NpemUgLyAzLCANCiAgICAgICAgIG1lYl9wYyA9IGZvb2RfZXhwZW5zZXNfcGVyX2NhcGl0YSAvICgxOTA1NTUgLyA1KSkgJT4lIA0KICANCiAgbXV0YXRlKGFncmlfaGhkID0gaWZlbHNlKGluY29tZV9tc19hZ3JpY3VsdHVyZSA9PSAxIHwgaW5jb21lX21zX2Zpc2hlcmllcyA9PSAxIHwgaW5jb21lX21zX2xpdmVzdG9jayA9PSAxIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdyaV9hY3Rpdml0eSA9PSAxIHwgaW5jb21lX3NlYyA8PSAxMCwgMSwgMCksDQogICAgICAgICBhZ3JpX21haW4gPSBpZmVsc2UoaW5jb21lX21zX2FncmljdWx0dXJlID09IDEgfCBpbmNvbWVfbXNfZmlzaGVyaWVzID09IDEgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX21zX2Zpc2hlcmllcyA9PSAxIHwgYWdyaV9hY3Rpdml0eSA9PSAxLCAxLCAwKSkgJT4lIA0KICByZW5hbWUoY2hpbGRyZW5fMF80ID0gaGhzaXplMDQpDQoNCiMgZnNfc2NvcmUgbWRlcHJpdg0KZnNfc2hhcmUgPC0gc3VydmV5ICU+JSAgDQogIHNlbGVjdChzdXJ2ZXlfaWQsIGhoZmNzX2ludiwgZmllc19yYXcsIGNzaV93ZWlnaHRlZCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhoaGZjc19pbnYsIGZpZXNfcmF3LCBjc2lfd2VpZ2h0ZWQpLCBzY2FsZSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhoaGZjc19pbnYsIGZpZXNfcmF3LCBjc2lfd2VpZ2h0ZWQpLCByYW5nZV93bmEpICU+JSANCiAgbWRlcHJpdihjKCJoaGZjc19pbnYiLCAiZmllc19yYXciLCAiY3NpX3dlaWdodGVkIiksIG1ldGhvZCA9ICJidiIsIG91dHB1dCA9ImFsbCIpDQoNCiMgZnNfc2NvcmUzIG1kZXByaXYNCmZzX3NoYXJlMiA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCksIH4gLiAqIDAuNSkgJT4lIA0KICBzZWxlY3Qoc3VydmV5X2lkLCBmY3Nfc3RhcGxlLCBmY3NfcHVsc2UsIGZjc19kYWlyeSwgZmNzX3Byb3RlaW4sIGZjc192ZWcsIGZjc19mcnVpdCwgZmNzX2ZhdCwgZmNzX3N1Z2FyLCANCiAgICAgICAgIGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwLCANCiAgICAgICAgIGNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlLCBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uLCBjc19lbWVyZ2VuY3lfaGhfcmlzaywNCiAgICAgICAgIGZpZXNfZmV3Zm9vZCwgZmllc19za2lwcGVkLCBmaWVzX3dobGRheSwgZmllc19odW5ncnksIGZpZXNfYXRlbGVzcywgZmllc19oZWFsdGh5LA0KICAgICAgICAgICAgICAgICBmaWVzX3J1bm91dCwgZmllc193b3JyaWVkKSAlPiUgDQogIG1kZXByaXYoYygiZmNzX3N0YXBsZSIsICJmY3NfcHVsc2UiLCAiZmNzX2RhaXJ5IiwgImZjc19wcm90ZWluIiwgImZjc192ZWciLCAiZmNzX2ZydWl0IiwgImZjc19mYXQiLCAiZmNzX3N1Z2FyIiwgDQogICAgICAgICAiY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMiLCAiY3NfY3Jpc2lzX25vX3NjaG9vbCIsICJjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwIiwgDQogICAgICAgICAiY3NfZW1lcmdlbmN5X3NvbGRfaG91c2UiLCAiY3NfZW1lcmdlbmN5X2hoX21pZ3JhdGlvbiIsICJjc19lbWVyZ2VuY3lfaGhfcmlzayIsDQogICAgICAgICAiZmllc19mZXdmb29kIiwgImZpZXNfc2tpcHBlZCIsICJmaWVzX3dobGRheSIsICJmaWVzX2h1bmdyeSIsICJmaWVzX2F0ZWxlc3MiLCAiZmllc19oZWFsdGh5IiwNCiAgICAgICAgICJmaWVzX3J1bm91dCIsICJmaWVzX3dvcnJpZWQiKSwgb3V0cHV0ID0gImFsbCIpDQoNCmZzX3NoYXJlMyA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCksIH4gLiAqIDAuNSkgJT4lIA0KICBzZWxlY3Qoc3VydmV5X2lkLCBmY3Nfc3RhcGxlLCBmY3NfcHVsc2UsIGZjc19kYWlyeSwgZmNzX3Byb3RlaW4sIGZjc192ZWcsIGZjc19mcnVpdCwgZmNzX2ZhdCwgZmNzX3N1Z2FyLCANCiAgICAgICAgIGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwLCANCiAgICAgICAgIGNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlLCBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uLCBjc19lbWVyZ2VuY3lfaGhfcmlzaywNCiAgICAgICAgIGZpZXNfZmV3Zm9vZCwgZmllc19za2lwcGVkLCBmaWVzX3dobGRheSwgZmllc19odW5ncnksIGZpZXNfYXRlbGVzcywgZmllc19oZWFsdGh5LA0KICAgICAgICAgICAgICAgICBmaWVzX3J1bm91dCwgZmllc193b3JyaWVkLCBjb21iaW5lZF93dCkgJT4lIA0KICBtZGVwcml2KGMoImZjc19zdGFwbGUiLCAiZmNzX3B1bHNlIiwgImZjc19kYWlyeSIsICJmY3NfcHJvdGVpbiIsICJmY3NfdmVnIiwgImZjc19mcnVpdCIsICJmY3NfZmF0IiwgImZjc19zdWdhciIsIA0KICAgICAgICAgImNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzIiwgImNzX2NyaXNpc19ub19zY2hvb2wiLCAiY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCIsIA0KICAgICAgICAgImNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlIiwgImNzX2VtZXJnZW5jeV9oaF9taWdyYXRpb24iLCAiY3NfZW1lcmdlbmN5X2hoX3Jpc2siLA0KICAgICAgICAgImZpZXNfZmV3Zm9vZCIsICJmaWVzX3NraXBwZWQiLCAiZmllc193aGxkYXkiLCAiZmllc19odW5ncnkiLCAiZmllc19hdGVsZXNzIiwgImZpZXNfaGVhbHRoeSIsDQogICAgICAgICAiZmllc19ydW5vdXQiLCAiZmllc193b3JyaWVkIiksIG91dHB1dCA9ICJhbGwiLCBzYW1wbGluZ193ZWlnaHRzID0gImNvbWJpbmVkX3d0IikNCg0KZnNfc2hhcmU0IDwtIHN1cnZleSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwKSwgfiAuICogMC41KSAlPiUgDQogIHNlbGVjdChzdXJ2ZXlfaWQsIGhoZmNzX2ludiwgDQogICAgICAgICBjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCwgDQogICAgICAgICBjc19lbWVyZ2VuY3lfc29sZF9ob3VzZSwgY3NfZW1lcmdlbmN5X2hoX21pZ3JhdGlvbiwgY3NfZW1lcmdlbmN5X2hoX3Jpc2ssDQogICAgICAgICBmaWVzX2Zld2Zvb2QsIGZpZXNfc2tpcHBlZCwgZmllc193aGxkYXksIGZpZXNfaHVuZ3J5LCBmaWVzX2F0ZWxlc3MsIGZpZXNfaGVhbHRoeSwNCiAgICAgICAgICAgICAgICAgZmllc19ydW5vdXQsIGZpZXNfd29ycmllZCwgY29tYmluZWRfd3QpICU+JSANCiAgbWRlcHJpdihjKCJoaGZjc19pbnYiLCANCiAgICAgICAgICJjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cyIsICJjc19jcmlzaXNfbm9fc2Nob29sIiwgImNzX2NyaXNpc19yZWR1Y2VkX2hlYWx0aF9leHAiLCANCiAgICAgICAgICJjc19lbWVyZ2VuY3lfc29sZF9ob3VzZSIsICJjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uIiwgImNzX2VtZXJnZW5jeV9oaF9yaXNrIiwNCiAgICAgICAgICJmaWVzX2Zld2Zvb2QiLCAiZmllc19za2lwcGVkIiwgImZpZXNfd2hsZGF5IiwgImZpZXNfaHVuZ3J5IiwgImZpZXNfYXRlbGVzcyIsICJmaWVzX2hlYWx0aHkiLA0KICAgICAgICAgImZpZXNfcnVub3V0IiwgImZpZXNfd29ycmllZCIpLCBvdXRwdXQgPSAiYWxsIiwgc2FtcGxpbmdfd2VpZ2h0cyA9ICJjb21iaW5lZF93dCIpDQoNCiMgcHJpb3JpdHkgc2NvcmVzDQpzdXJ2ZXkgPC0gc3VydmV5ICU+JQ0KICBsZWZ0X2pvaW4oZnNfc2hhcmUkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChzY29yZV9pLCBzdXJ2ZXlfaWQpLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIGxlZnRfam9pbihmc19zaGFyZTIkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChmc19zY29yZTIgPSBzY29yZV9pLCBzdXJ2ZXlfaWQpLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIGxlZnRfam9pbihmc19zaGFyZTMkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChmc19zY29yZTMgPSBzY29yZV9pLCBzdXJ2ZXlfaWQpLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIGxlZnRfam9pbihmc19zaGFyZTQkZGF0YSAlPiUgIA0KICAgICAgICAgICAgICBzZWxlY3QoZnNfc2NvcmU0ID0gc2NvcmVfaSwgc3VydmV5X2lkKSwgYnkgPSAic3VydmV5X2lkIikgJT4lIA0KICAgbXV0YXRlKHByaW9yaXR5MSA9IGNhc2Vfd2hlbihoaGZjc19pbnYgPj0gbWVhbihoaGZjc19pbnYpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBtZWFuKGZpZXNfcmF3X3JhbmdlKSAmIGNzaV93ZWlnaHRlZCA+PSBtZWFuKGNzaV93ZWlnaHRlZCkgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lDQogIG11dGF0ZShwcmlvcml0eTIgPSBpZmVsc2Uoc2NvcmVfaSA+PSBtZWFuKHNjb3JlX2kpLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocHJpb3JpdHkzID0gY2FzZV93aGVuKGhoZmNzX2ludiA+PSBtZWFuKGhoZmNzX2ludikgJiBmaWVzX3Jhd19yYW5nZSA+PSBtZWFuKGZpZXNfcmF3X3JhbmdlKSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoZmNzX2ludiA+PSBtZWFuKGhoZmNzX2ludikgJiBjc2lfd2VpZ2h0ZWQgPj0gbWVhbihjc2lfd2VpZ2h0ZWQpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllc19yYXdfcmFuZ2UgPj0gbWVhbihmaWVzX3Jhd19yYW5nZSkgJiBjc2lfd2VpZ2h0ZWQgPj0gbWVhbihjc2lfd2VpZ2h0ZWQpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUgDQogIG11dGF0ZShwcmlvcml0eSA9IGNhc2Vfd2hlbihoaGZjc19pbnYgPj0gcXVhbnRpbGUoaGhmY3NfaW52LCBwcm9icyA9IDAuNzUpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBxdWFudGlsZShmaWVzX3Jhd19yYW5nZSwgcHJvYnMgPSAwLjc1KSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoZmNzX2ludiA+PSBxdWFudGlsZShoaGZjc19pbnYsIHByb2JzID0gMC43NSkgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaV93ZWlnaHRlZCA+PSBxdWFudGlsZShjc2lfd2VpZ2h0ZWQsIHByb2JzID0gMC43NSkgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllc19yYXdfcmFuZ2UgPj0gcXVhbnRpbGUoZmllc19yYXdfcmFuZ2UsIHByb2JzID0gMC43NSkgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaV93ZWlnaHRlZCA+PSBxdWFudGlsZShjc2lfd2VpZ2h0ZWQsIHByb2JzID0gMC43NSkgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JSANCiAgbXV0YXRlKHByaW9yaXR5NSA9IGNhc2Vfd2hlbihoaGZjc19pbnYgPj0gcXVhbnRpbGUoaGhmY3NfaW52LCBwcm9icyA9IDAuNzUpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllc19yYXdfcmFuZ2UgPj0gcXVhbnRpbGUoZmllc19yYXdfcmFuZ2UsIHByb2JzID0gMC43NSkgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaV93ZWlnaHRlZCA+PSBxdWFudGlsZShjc2lfd2VpZ2h0ZWQsIHByb2JzID0gMC43NSkgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JSANCiAgcmVuYW1lKGZzX3Njb3JlID0gc2NvcmVfaSkNCg0KIyBzdXJ2ZXkgbG9uZw0Kc3VydmV5X2xvbmcgPC0gc3VydmV5ICU+JQ0KICBzZWxlY3Qoc3VydmV5X2lkLCBwcmlvcml0eSwgZnNfc2NvcmUsIGZzX3Njb3JlMiwgZnNfc2NvcmUzLCBmc19zY29yZTQsIG1lYl9wYywgDQogICAgICAgICBjb250YWlucygiY3NfIiksIGNvbnRhaW5zKCJjc2lfIiksIGNvbnRhaW5zKCJmaWVzIiksIGNvbnRhaW5zKCJmY3NfIiksIGNvbnRhaW5zKCJuZWVkc18iKSwgDQogICAgICAgICBoaGZjc19pbnYsIG5lZWQsIGNvbWJpbmVkX3d0LCANCiAgICAgICAgIGhvaF9mZW1hbGUsIGNoaWxkcmVuXzBfNCwgaGhfc2l6ZSwgaGhkaXNhYmlsaXR5LCANCiAgICAgICAgIHJ1cmFsLCBleHBlbnNlX2Zvb2QsIG5vdF9pbXByb3ZlZF9zYW5pdGF0aW9uLCBpbmNvbWVfbWFpbl9jb21wLCBhZ3JpX2FjdGl2aXR5LA0KICAgICAgICAgbGhjc2lfbWF4LCBsaGNzaV9yYW5nZSwgYWNjZXNzbWFya2V0KSAlPiUgDQogIHNlbGVjdCgtY29udGFpbnMoInd0IiksIC1ub3RlZmNzXywgLWxoY3NpX21heF9hZykgJT4lIA0KICBsZWZ0X2pvaW4oc3VydmV5ICU+JSBzZWxlY3Qoc3VydmV5X2lkLCBpbmNvbWVfc291cmNlLCBob2hfZWR1Y2F0aW9uLCBob2hfYWdlLCByZXNpZGVuY2VfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gIm9sZF92YXIiLCB2YWx1ZXNfdG8gPSAidmFyIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh2YWx1ZSA9IDEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1vbGRfdmFyKSAlPiUgDQogICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXIsIHZhbHVlc19mcm9tID0gdmFsdWUsIHZhbHVlc19maWxsID0gMCksIGJ5ID0gInN1cnZleV9pZCIpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgcmJpbmQoc3VydmV5ICU+JSBzZWxlY3QoY29udGFpbnMoInNob2Nrc18iKSwgc3VydmV5X2lkKSAlPiUNCiAgICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpKQ0KDQpgYGANCg0KDQojIyBJbnRyb2R1Y3Rpb24gDQoNClByaW9yaXRpc2F0aW9uIGNhbiBsYXJnZWx5IGJlIGJyb2tlbiBpbnRvIHR3byBzdGVwcyAtLSBnZW9ncmFwaGljIHByaW9yaXRpc2F0aW9uIGFuZCBiZW5lZmljaWFyeSBzZWxlY3Rpb24uIA0KDQpUaGlzIGRvY3VtZW50IGV4YW1pbmVzIGRhdGEgZnJvbSB0aGUgRkFPLVdGUCBTaG9ja3MsIEFncmljdWx0dXJhbCBMaXZlbGlob29kcyBhbmQgRm9vZCBTZWN1cml0eSBTdXJ2ZXksIHRoZSBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiBhbmQgRXZlbnQgRGF0YXNldCAoQUNMRUQpIGFuZCB0aGUgTXlhbm1hciBJbmZvcm1hdGlvbiBNYW5hZ2VtZW50IFVuaXQgKE1JTVUpLiANCg0KVGhlIGZpcnN0IHNlY3Rpb24gZGVhbHMgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgYSBiZW5lZmljaWFyeSBwcm9maWxlIHVzaW5nIHRoZSBGQU8tV0ZQIHN1cnZleSBkYXRhIHRvIGluZm9ybSBiZW5lZmljaWFyeSBzZWxlY3Rpb24uIFRoZSBzZWNvbmQgc2VjdGlvbiBtYWtlcyB1c2Ugb2YgQUNMRUQgZGF0YSBmb3IgTXlhbm1hciB0byBkZXZlbG9wIGEgY29uZmxpY3Qgc2NvcmUgZm9yIHRvd25zaGlwIHByaW9yaXRpc2F0aW9uLiBUb3duc2hpcCBhbmQgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhIGFyZSBsaW5rZWQgYnkgYSBkZWNpc2lvbiB0cmVlLiBUaGUgdGhpcmQgc2VjdGlvbiBwcmVzZW50cyBmbG9vZCByaXNrcyBieSB0b3duc2hpcCAtLSB0aGVzZSBhcmUgb25seSBwcm9iYWJpbGl0aWVzIGFuZCBzZXJ2ZSBhcyByZWZlcmVuY2VzIGZvciBwcmVwb3NpdGlvbmluZyBhbmQgZGlzYXN0ZXIgcmlzayByZWR1Y3Rpb24uIFRoZXkgbm90IGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHByaW9yaXRpc2F0aW9uIHByb2Nlc3MsIHRob3VnaCB0aGlzIG1pZ2h0IGNoYW5nZSBpZiBkaXNhc3RlcnMgb2NjdXIuIFRoaXMgZG9jdW1lbnQgaXMgY2xvc2VkIGJ5IGEgc2VjdGlvbiBvbiB0ZWNobmljYWwgbm90ZXMuIA0KDQo8YnI+DQoNCg0KIyMjIFJlZmVyZW5jZXMgZm9yIHRoaXMgcmVwb3J0DQoqIEFDTEVEICgyMDIyKS4gQUNMRUQgZGF0YSBmb3IgTXlhbm1hciAoMjAxMC0yMDIyKS4gaHR0cHM6Ly9hY2xlZGRhdGEuY29tLg0KKiBNYXJpYSBOb2VsIFBpIEFscGVyaW4sIFBoaWxpcHBlIFZhbiBLZXJtICgyMDA5KS4gbWRlcHJpdjogU3ludGhldGljIGluZGljYXRvcnMgb2YgbXVsdGlwbGUgZGVwcml2YXRpb24uIFN0YXRhIGNvbW1hbmQuIGh0dHA6Ly9tZWRpbS5jZXBzLmx1L3N0YXRhL21kZXByaXZfdjMucGRmDQoqIEF0aWxsaW8gQmVuaW5pLCBBbGRvIEJlbmluaSAoMjAyMSkuIG1kZXByaXY6IFN5bnRoZXRpYyBzY29yZXMgb2YgbXVsdGlwbGUgZGVwcml2YXRpb24uIFIgcGFja2FnZSB2ZXJzaW9uIDAuMC4zLiAgaHR0cHM6Ly9naXRodWIuY29tL2EtYmVuaW5pL21kZXByaXYvLg0KKiBHaWFubmkgQmV0dGksIFZpamF5IFZlcm1hICgyMDA0KS4gQSBtZXRob2RvbG9neSBmb3IgdGhlIHN0dWR5IG9mIG11bHRpLWRpbWVuc2lvbmFsIGFuZCBsb25naXR1ZGluYWwgYXNwZWN0cyBvZiBwb3ZlcnR5IGFuZCBkZXByaXZhdGlvbi4gRGlwYXJ0YW1lbnRvIGRpIE1ldG9kaSBRdWFudGl0YXRpdmksIFVuaXZlcnNpdGEgZGkgU2llbmEuIGh0dHA6Ly9yZXBlYy5kZXBzLnVuaXNpLml0L3F1YWRlcm5pLzQ5RE1RLnBkZi4gDQoqIEZBTyBhbmQgV0ZQICgyMDIyKS4gTXlhbm1hciB8IFNob2NrcywgYWdyaWN1bHR1cmFsIGxpdmVsaWhvb2RzIGFuZCBmb29kIHNlY3VyaXR5OiBNb25pdG9yaW5nIHJlcG9ydCwgTWFyY2ggMjAyMi4gUm9tZS4gDQoqIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgTXlhbm1hciAoMjAyMSkuIDVXcyByZXBvcnRpbmcgdG9vbC4NCiogRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBNeWFubWFyICgyMDIyKS4gVW5kZXJzdGFuZGluZyBDb25mbGljdCBEeW5hbWljcyBpbiBNeWFubWFyIHRocm91Z2ggQ29uZmxpY3QgYW5kIEluY2lkZW50IERhdGE6IEEgRm9vZCBTZWN1cml0eSBQZXJzcGVjdGl2ZS4gaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vZXhwbG9yYXRvcnktZGF0YS1hbmFseXNpcy1hY2xlZC1mc2MvLg0KKiBIQVJQLUYgYW5kIE1JTVUgKDIwMTgpLiBWdWxuZXJhYmlsaXR5IGluIE15YW5tYXI6IEEgU2Vjb25kYXJ5IERhdGEgUmV2aWV3IG9mIE5lZWRzLCBDb3ZlcmFnZSBhbmQgR2Fwcy4gaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIuDQoqIElGUFJJICgyMDIyKS4gSG91c2Vob2xkIFdlbGZhcmUgaW4gTXlhbm1hcjogUmVzdWx0cyBmcm9tIHRoZSBNeWFubWFyIEhvdXNlaG9sZCBXZWxmYXJlIFN1cnZleS4gDQoqIE1JTVUgKDIwMjIpLiBDbGltYXRlLCBFbnZpcm9ubWVudGFsIERlZ3JhZGF0aW9uIGFuZCBEaXNhc3RlciBSaXNrIGluIE15YW5tYXIuIA0KKiBVTkhDUiAoMjAyMikuIFByZSBhbmQgUG9zdCAxIEZlYiAyMDIxIElEUHMgUG9wdWxhdGlvbiBieSBUb3duc2hpcCBsZXZlbC4gDQoqIFdGUCBOaWdlcmlhIENvdW50cnkgT2ZmaWNlICgyMDE4KS4gU3RhbmRhcmQgT3BlcmF0aW5nIFByb2NlZHVyZTogQmVuZWZpY2lhcnkgVGFyZ2V0aW5nIGluIE5vcnRoIEVhc3Rlcm4gTmlnZXJpYS4gRGlyZWN0aXZlOiBOQ08vUFUvMjAxOS8wNC4gDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLiBCZW5lZmljaWFyeSBwcm9maWxlLCB1c2luZyBGQU8tV0ZQIHN1cnZleSBkYXRhDQoNCkEgdG90YWwgb2YgYHIgbnJvdyhzdXJ2ZXkpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBob3VzZWhvbGRzIHdlcmUgaW50ZXJ2aWV3ZWQgaW4gdGhlIEZBTy1XRlAgU2hvY2tzLCBBZ3JpY3VsdHVyYWwgTGl2ZWxpaG9vZHMgYW5kIEZvb2QgU2VjdXJpdHkgU3VydmV5IGluIEF5ZXlhcndhZHksIENoaW4sIEthY2hpbiwgS2F5YWgsIEtheWluLCBNb24sIFJha2hpbmUsIFNoYW4gYW5kIFlhbmdvbiB0byBtb25pdG9yIGZvb2Qgc2VjdXJpdHkgYW5kIGxpdmVsaWhvb2RzIG9mIHBlcnNvbnMgaW4gTXlhbm1hci4gU29tZSBvZiB0aGUgbW9zdCBrZXkgZGF0YSBjb2xsZWN0ZWQgd2VyZSBvbiB0aGUgdmFyaW91cyBmb29kIHNlY3VyaXR5IGluZGljZXMgLS0gdGhlIEZvb2QgQ29uc3VtcHRpb24gU2NvcmUgKEZDUyksIHRoZSBGb29kIEluc2VjdXJpdHkgRXhwZXJpZW5jZSBTY2FsZSAoRklFUykgYW5kIHRoZSBMaXZlbGlob29kIENvcGluZyBTdHJhdGVnaWVzIEluZGV4IChDU0kpLiBNdWNoIG1vcmUgZGV0YWlsIGNhbiBiZSBnbGVhbmVkIGZyb20gdGhlIHJlcG9ydCBpdHNlbGYgLS0gdGhpcyBkb2N1bWVudCBmb2N1c2VzIG9ubHkgb24gdGhlIGFzcGVjdHMgb2YgdGhlIHN1cnZleSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgcHJpb3JpdGlzYXRpb24uIEluZm9ybWF0aW9uIHdhcyBhbHNvIGNvbGxlY3RlZCBvbiBiYXNpYyBob3VzZWhvbGQgZGVtb2dyYXBoaWNzIGFzIHdlbGwgb24gaW5jb21lIHNvdXJjZXMuDQoNCiANCjxicj48YnI+DQoNCiMjIyAxLjEgT3ZlcnZpZXcgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgaW5kaWNhdG9ycw0KDQpBIGNvbXBvc2l0ZSBvZiB0aGUgdGhyZWUgaW5kaWNlcywgdGhlIEZvb2QgSW5zZWN1cml0eSBTY29yZSBoYXMgYWxzbyBiZWVuIGNhbGN1bGF0ZWQuIFRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBjb21wb3NpdGUgc2NvcmUgaXMgZGV0YWlsZWQgaW4gc2VjdGlvbiA0LjIuIEJ1dCBnb2luZyBmb3J3YXJkLCB0aGlzIGRvY3VtZW50IHdpbGwgdXNlIHRoZSBGb29kIEluc2VjdXJpdHkgU2NvcmUgYXMgYSBwcm94eSBmb3IgZm9vZCBpbnNlY3VyaXR5IGl0c2VsZi4gDQoNClRoZSBwbG90cyBiZWxvdyByYW5rcyB2YXJpYWJsZXMgaW4gb3JkZXIgb2YgdGhlaXIgYWJpbGl0eSB0byBwcmVkaWN0IHRoZSB2YXJpb3VzIGZvb2QgaW5zZWN1cml0eSBpbmRpY2VzLiBPbmx5IGVudmlyb25tZW50YWwgb3IgZGVtb2dyYXBoaWMgdmFyaWFibGVzIHdlcmUgdGFrZW4gaW50byBhY2NvdW50IGFzIGl0IHdvdWxkIGJlIHJlZHVuZGFudCB0byBwcmVkaWN0IGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyB1c2luZyB0aGUgY29tcG9uZW50cyBvZiBzYWlkIGluZGljZXMuIE9ubHkgcmVzcG9uc2VzIHRoYXQgb2NjdXJyZWQgbW9yZSB0aGFuIDIwMCB0aW1lcyAob3V0IG9mIDIsNzA4KSBpbiB0aGUgc3VydmV5IHdlcmUgY29uc2lkZXJlZC4gDQoNClZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIHJlZCBhcmUgbW9zdCBsaWtlbHkgdG8gcmVzdWx0IGluIGhpZ2ggZm9vZCBpbnNlY3VyaXR5IHNjb3JlcyAodGhhdCBpcywgaGlnaGVyIGZvb2QgaW5zZWN1cml0eSkgYW5kIHZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIGJsdWUgYXJlIG1vcmUgbGlrZWx5IHRvIHJlc3VsdCBpbiBsb3dlciBmb29kIGluc2VjdXJpdHkgc2NvcmVzLiBUaGUgZG90dGVkIHJlZCBsaW5lIGRvd24gdGhlIG1pZGRsZSBhdCAkeD0wJCBzcGxpdHMgdmFyaWFibGVzIGludG8gd2hldGhlciB0aGUgcHJlZGljdCBoaWdoZXIgZm9vZCBpbnNlY3VyaXR5IChwb3NpdGl2ZSBudW1iZXJzKSBvciBsb3dlciBmb29kIGluc2VjdXJpdHkgKG5lZ2F0aXZlIG51bWJlcnMpLiANCg0KRm9yIGFsbCB0aGVzZSBwbG90cywgdGhlIHNjb3JlcyBvZiB0aGUgZm9vZCBzZWN1cml0eSBpbmRpY2VzIGhhdmUgYWxsIGJlZW4gc2NhbGVkIGJldHdlZW4gMCBhbmQgMSwgd2l0aCBoaWdoZXIgc2NvcmVzIGluZGljYXRpbmcgZ3JlYXRlciBmb29kIGluc2VjdXJpdHkuIFRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgYmVsb3cgc2hvdyBob3cgbXVjaCBhIHBvc2l0aXZlIHJlc3BvbnNlIG9uIHRoZXNlIHZhcmlhYmxlcyB3b3VsZCBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgc2NvcmUgb24gZWFjaCBvZiB0aGUgaW5kaWNlcy4gDQoNCjxicj4NCg0KYGBge3IgY29lZmZpY2llbnQtcGxvdC1wcmlvcml0eSwgZmlnLmhlaWdodD04LjV9DQpsbV9wcmVwX2xvbmcgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkodmFyKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IGlmZWxzZSh2YWx1ZSA+IDAsIDEsIDApLA0KICAgICAgICAgY291bnQgPSBzdW0oY291bnQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKGNvdW50ID4gMjAwKSAlPiUgIyBhZGp1c3QgdGhlIHRocmVzaG9sZCBuDQogIHNlbGVjdCgtY291bnQpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhciwgdmFsdWVzX2Zyb20gPSB2YWx1ZSwgdmFsdWVzX2ZuID0gbWF4KSAlPiUgDQogIHNlbGVjdCgtc3VydmV5X2lkLCAtc2hvY2tzX25vbmUpDQp9DQoNCnBsb3RfY29lZiA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSAgDQogICAgdGlkeShjb25mLmludCA9IFRSVUUpICU+JQ0KICAgIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSANCiAgICBtdXRhdGUodGVybSA9IHN0cl9yZXBsYWNlKHRlcm0sICJpbmNvbWVfbXMiLCAiaW5jb21lX3NvdXJjZSIpLA0KICAgICAgICAgICB0ZXJtID0gc3RyX3JlcGxhY2UodGVybSwgImhvaF9hZ2UiLCAiIiksDQogICAgICAgICAgIHRlcm0gPSBzdHJfcmVwbGFjZSh0ZXJtLCAiaG9oX2VkdWNhdGlvbiIsICIiKSwgDQogICAgICAgICAgIHRlcm0gPSBmY3RfcmVvcmRlcih0ZXJtLCBlc3RpbWF0ZSkpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSwgeSA9IHRlcm0sIGNvbG91ciA9IGVzdGltYXRlKSkgKyANCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKw0KICAgIGdlb21fcG9pbnQoKSArIA0KICAgIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBoZWlnaHQgPSAwLjIpICsNCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAidHVyYm8iKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LjUpLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIiksDQogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsNCiAgICBsYWJzKHggPSAiRXN0aW1hdGUiLCB5ID0gIiIpDQp9DQoNCnN1cnZleV9sb25nICU+JSAgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhciwgInNob2Nrc198aG9oX3xydXJhbHxleHBlbnNlX2Zvb2R8bm90X2ltcHJvdmVkfGFncmlfYWN0aXZpdHl8aW5jb21lX21zX3xlZHVffHNpemV8Y2hpbGRyZW58ZGlzYWJpbGl0eSIpIHwNCiAgICAgICAgICAgdmFyICVpbiUgYygiZnNfc2NvcmU0IiwgImV4cGVuc2VfZm9vZCIpKSAlPiUgDQogIGxtX3ByZXBfbG9uZygpICU+JSANCiAgbXV0YXRlKGZzX3Njb3JlNCA9IGxvZyhmc19zY29yZTQpKSAlPiUgDQogIG11dGF0ZShmc19zY29yZTQgPSBpZmVsc2UoaXMuaW5maW5pdGUoZnNfc2NvcmU0KSwgMCwgZnNfc2NvcmU0KSkgJT4lIA0KICBsbShmc19zY29yZTQgfiAuLCBkYXRhID0gLikgJT4lIA0KICBwbG90X2NvZWYoKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QgaW5zZWN1cml0eSBzY29yZSIpICsgDQogIA0Kc3VydmV5X2xvbmcgJT4lDQogICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KHZhciwgInNob2Nrc198aG9oX3xydXJhbHxleHBlbnNlX2Zvb2R8bm90X2ltcHJvdmVkfGFncmlfYWN0aXZpdHl8aW5jb21lX21zX3xlZHVffHNpemV8Y2hpbGRyZW58ZGlzYWJpbGl0eSIpIHwNCiAgICAgICAgIHZhciAlaW4lIGMoImNzaV93ZWlnaHRlZCIsICJleHBlbnNlX2Zvb2QiKSkgJT4lDQogIGxtX3ByZXBfbG9uZygpICU+JQ0KICBsbShjc2lfd2VpZ2h0ZWQgfiAuLCBkYXRhID0gLikgJT4lDQogIHBsb3RfY29lZigpICsgDQogIGxhYnModGl0bGUgPSAiQ29waW5nIHN0cmF0ZWdpZXMgaW5kZXgiKSArIA0KICANCnN1cnZleV9sb25nICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdCh2YXIsICJzaG9ja3NffGhvaF98cnVyYWx8ZXhwZW5zZV9mb29kfG5vdF9pbXByb3ZlZHxhZ3JpX2FjdGl2aXR5fGluY29tZV9tc198ZWR1X3xzaXplfGNoaWxkcmVufGRpc2FiaWxpdHkiKSB8DQogICAgICAgICAgIHZhciAlaW4lIGMoImhoZmNzX2ludiIsICJleHBlbnNlX2Zvb2QiKSkgJT4lDQogIGxtX3ByZXBfbG9uZygpICU+JQ0KICBsbShoaGZjc19pbnYgfiAuLCBkYXRhID0gLikgJT4lDQogIHBsb3RfY29lZigpICsgDQogIGxhYnModGl0bGUgPSAiRm9vZCBjb25zdW1wdGlvbiBzY29yZSIpICsgDQoNCnN1cnZleV9sb25nICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdCh2YXIsICJzaG9ja3NffGhvaF98cnVyYWx8ZXhwZW5zZV9mb29kfG5vdF9pbXByb3ZlZHxhZ3JpX2FjdGl2aXR5fGluY29tZV9tc198ZWR1X3xzaXplfGNoaWxkcmVufGRpc2FiaWxpdHkiKSB8DQogICAgICAgICAgIHZhciAlaW4lIGMoImZpZXNfcmF3X3JhbmdlIiwgImV4cGVuc2VfZm9vZCIpKSAlPiUNCiAgbG1fcHJlcF9sb25nKCkgJT4lDQogIGxtKGZpZXNfcmF3X3JhbmdlIH4gLiwgZGF0YSA9IC4pICU+JQ0KICBwbG90X2NvZWYoKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QgaW5zZWN1cml0eSBleHBlcmllbmNlIHNjYWxlIikNCmBgYA0KDQo8YnI+DQoNClRoZSB2YXJpYWJsZXMgdGhhdCB0ZW5kIHRvIHRvIGNvbnRyaWJ1dGUgdGhlIG1vc3QgdG8gaGlnaCBmb29kIGluc2VjdXJpdHkgc2NvcmVzIGFyZSBhIGhvdXNlaG9sZCdzIGV4cG9zdXJlIHRvIGNvbmZsaWN0IGFuZCBuYXR1cmFsIGhhemFyZHMsIHdoZXRoZXIgb3Igbm90IHRoZXkgbG9zdCBlbXBsb3ltZW50IG9yIHdvcmsgb3Bwb3J0dW5pdGllcywgd2hldGhlciBvciBub3QgdGhleSB3ZXJlIGVuZ2FnZWQgaW4gY2FzdWFsIG5vbi1hZ3JpY3VsdHVyYWwgbGFib3VyIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGV5IHJlcG9ydGVkIG5vIGluY29tZSBpbiB0aGUgdGhyZWUgbW9udGhzIHByaW9yIHRvIHRoZSBzdXJ2ZXkuIA0KDQpUaGVzZSB2YXJpYWJsZXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBiYXNpYyBiZW5lZmljaWFyeSBwcm9maWxlIHRoYXQgY2FuIGluZm9ybSBiZW5lZmljaWFyeSBzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIGZvb2Qgc2VjdXJpdHkgYW5kIGxpdmVsaWhvb2RzIHByb2dyYW1taW5nLiBUaGlzIGxpc3QgaXMsIG9mIGNvdXJzZSwgbm9uLWV4aGF1c3RpdmUgYXMgaXQgaXMgbGltaXRlZCB0byBvbmx5IHRoZSB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNvbGxlY3RlZCBhcyBwYXJ0IG9mIHRoZSBGQU8tV0ZQIHN1cnZleS4NCg0KVGhlIHZhcmlhYmxlcyB0aGF0IHdlcmUgdGhlIGJlc3QgcHJlZGljdG9ycyBvZiBsb3cgZm9vZCBpbnNlY3VyaXR5IHdlcmUgd2hldGhlciBvciBub3QgdGhlIGhlYWQgb2YgaG91c2Vob2xkIGhhZCBjb21wbGV0ZWQgaGlnaGVyIGVkdWNhdGlvbiwgd2hldGhlciBvciBub3QgdGhlIG1haW4gaW5jb21lIHNvdXJjZSBvZiB0aGUgaG91c2Vob2xkIHdhcyBzdGFibGUgbm9uLWFncmljdWx0dXJhbCBlbXBsb3ltZW50LiANCg0KPGJyPjxicj4NCg0KIyMjIDEuMiBTZXR0aW5nIGEgdGhyZXNob2xkIGZvciBwcmlvcml0aXNhdGlvbiANCg0KQW4gaW1wb3J0YW50IHN0ZXAgaXMgbmFycm93aW5nIGRvd24gdGhlIHBvcHVsYXRpb24gdG8gYSBwcmlvcml0eSBncm91cCAtLSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgcGFydG5lcnMgZG8gbm90IGhhdmUgdGhlIHJlc291cmNlcyB0byB0YXJnZXQgYWxsIHBlcnNvbnMuDQoNCj5BIGhvdXNlaG9sZCB3b3VsZCBiZSBjb25zaWRlcmVkIGEgcHJpb3JpdHkgZm9yIGludGVydmVudGlvbiB3aGVuIGFib3ZlIHRoZSA3NXRoIHBlcmNlbnRpbGUgaW4gYXQgbGVhc3QgdHdvIG91dCBvZiB0aGUgdGhyZWUgZm9vZCBzZWN1cml0eSBpbmRpY2VzIChmb29kIGNvbnN1bXB0aW9uIHNjb3JlLCBjb3Bpbmcgc3RyYXRlZ2llcyBpbmRleCBhbmQgZm9vZCBpbnNlY3VyaXR5IGV4cGVyaWVuY2Ugc2NhbGUpDQoNCkFwcHJveGltYXRlbHkgMzQlIG9mIHRoZSBzYW1wbGVkIHBvcHVsYXRpb24gZmFsbHMgaW50byB0aGlzIHByaW9yaXR5IGdyb3VwLiBUaGUgcGxvdHMgYmVsb3cgc2hvd3MgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGF2ZXJhZ2UgdmFsdWVzIG9mIGZvb2Qgc2VjdXJpdHkgaW5kZXggY29tcG9uZW50cyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIHByaW9yaXR5IGhvdXNlaG9sZHMgb3Igbm90LiBWYXJpYWJsZXMgaW4gYmx1ZSBjb3JyZXNwb25kIHRvIENvcGluZyBTdHJhdGVnaWVzIEluZGV4IGluZGljYXRvcnMsIHRob3NlIGluIHJlZCB0byB0aGUgRm9vZCBJbnNlY3VyaXR5IEV4cGVyaWVuY2UgU2NhbGUuIA0KDQpUaG9zZSBpbiBncmVlbiBjb3JyZXNwb25kIHRvIHRoZSBGb29kIENvbnN1bXB0aW9uIFNjb3JlLiBGb3IgdGhlc2UgaW5kaWNhdG9ycywgdGhleSBoYXZlIGJlZW4gcmVzY2FsZWQgc28gdGhhdCBhIHZhbHVlIG9mIDEgc2hvd3MgdGhhdCBhIGhvdXNlaG9sZCBoYXMgbm90IGNvbnN1bWVkIHRoYXQgZm9vZCBncm91cCBhdCBhbGwgaW4gdGhlIHByZXZpb3VzIDcgZGF5cyBhbmQgYSB2YWx1ZSBvZiAwIHNob3dzIHRoYXQgdGhleSBoYXZlIGNvbnN1bWVkIHRoYXQgZm9vZCBncm91cCBldmVyeSBkYXkgZm9yIHRoZSBwYXN0IDcgZGF5cy4gDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtcHJpb3JpdHktZ3JvdXAtY29tcGFyaXNvbn0NCnN1cnZleSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJmaWVzIiksIGNvbnRhaW5zKCJmY3NfIiksIGNvbnRhaW5zKCJjc19lbWVyZ2VuY3kiKSwgY29udGFpbnMoImNzX2NyaXNpcyIpLCANCiAgICAgICAgICAgICAgICAgIHByaW9yaXR5KSAlPiUgDQogIHNlbGVjdCgtZmllc19yYXcsIC1maWVzX3Jhd19yYW5nZSwgLW5vdGVmY3NfLCAtaGhmY3NfaW52LCAtZmNzX2JvcmRlcmxpbmVfcG9vciwgLWNvbnRhaW5zKCJ3dCIpLCAtY29udGFpbnMoImhocyIpKSAlPiUNCiAgZHJvcF9uYSgpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtcHJpb3JpdHksIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ3JvdXBfYnkodmFyLCBwcmlvcml0eSkgJT4lIA0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4odmFsdWUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhtZWFuKSkgJT4lIA0KICBtdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oc3RyX2RldGVjdCh2YXIsICJmY3MiKSB+ICJmY3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdCh2YXIsICJjc18iKSB+ICJjc2kiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QodmFyLCAiZmllcyIpIH4gImZpZXMiKSwNCiAgICAgICAgIHZhciA9IHJlb3JkZXJfd2l0aGluKHZhciwgYnkgPSBtZWFuLCB3aXRoaW4gPSBncm91cCksIA0KICAgICAgICAgcHJpb3JpdHkgPSByZWNvZGUocHJpb3JpdHksIGAwYCA9ICJub3RfcHJpb3JpdHkiLCBgMWAgPSAicHJpb3JpdHkiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuLCB5ID0gcmVvcmRlcl93aXRoaW4odmFyLCBieSA9IG1lYW4sIHdpdGhpbiA9IGdyb3VwKSwgZmlsbCA9IGdyb3VwKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocm91bmQobWVhbiwgZGlnaXRzID0gMikpKSwgc2l6ZSA9IDMsIGhqdXN0ID0gLTAuMSkgKyANCiAgbGFicyh4ID0gIk1lYW4iLCB5ID0gIiIsIHRpdGxlID0gIlByZXZhbGVuY2Ugb2YgZm9vZCBpbnNlY3VyaXR5IGluIHRoZSBzdXJ2ZXllZCBwb3B1bGF0aW9uIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IDEuMDUpICsNCiAgZmFjZXRfd3JhcCh+cHJpb3JpdHkpICsgDQogIHNjYWxlX3lfcmVvcmRlcmVkKCkNCmBgYA0KDQo8YnI+IA0KDQpXaGlsc3QgYm90aCBncm91cHMgdGVuZCB0byBjb25zdW1lIGxvdyBhbW91bnRzIG9mIGRhaXJ5LCBwdWxzZXMsIHN1Z2FyIGFuZCBmcnVpdHMsIHRoZXNlIHRyZW5kcyBhcmUgbXVjaCBtb3JlIHByb25vdW5jZWQgaW4gdGhlIHByaW9yaXR5IGdyb3VwLiBBZGRpdGlvbmFsbHksIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIGFyZSBtb3JlIHRoYW4gdHdpY2UgYXMgbGlrZWx5IHRvIGhhdmUgcG9vciBwcm90ZWluIGNvbnN1bXB0aW9uLCBiZSB3b3JyaWVkIGFib3V0IG5vdCBoYXZpbmcgZW5vdWdoIGZvb2QgYW5kIGVhdCBsZXNzIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLiANCg0KSG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgd2VyZSBhbHNvIG1vcmUgdGhhbiBmb3VyIHRpbWVzIGFzIGxpa2VseSB0byBoYXZlIHJlZHVjZWQgaGVhbHRoY2FyZSBleHBlbmRpdHVyZXMsIGhhdmUgc29sZCBwcm9kdWN0aXZlIGFzc2V0cyBhbmQgYmUgdW5hYmxlIHRvIGVhdCBoZWFsdGh5IGFuZCBudXRyaXRpb3VzIGZvb2RzIGFuZCBlYXQgb25seSBhIGZldyBraW5kcyBvZiBmb29kcy4gVGhleSBhcmUgYWxzbyBtb3JlIHRoYW4gZml2ZSB0aW1lcyBhcyBsaWtlbHkgdG8gc2tpcHBlZCBtZWFscyBvciBnb25lIGh1bmdyeS4gDQoNCjxicj4gDQoNCiMjIyAxLjMgVmFyaWFibGVzIGNvbnNpZGVyZWQgaW4gdGhlIGJlbmVmaWNpYXJ5IHByb2ZpbGUNCg0KVGhlIGludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgdmFyaW91cyBlbnZpcm9ubWVudGFsIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMgY29sbGVjdGVkIGJ5IHRoZSBGQU8tV0ZQIHN1cnZleS4gVGhlIGZpcnN0IGNvbHVtbiBsaXN0cyB0aGUgdmFyaWFibGUgbmFtZSwgdGhlIHNlY29uZCBhbmQgdGhpcmQgc2hvdyB0aGUgbWVhbiB2YWx1ZXMgZm9yIGVhY2ggdmFyaWFibGUgYmFzZWQgb24gaG91c2Vob2xkcyBpbnNpZGUgYW5kIG91dHNpZGUgb2YgdGhlIHByaW9yaXR5IGdyb3VwIC0tIGZvciBpbnN0YW5jZSwgZnJvbSB0aGUgdGFibGUsIGl0IGNhbiBiZSBzZWVuIHRoYXQgMi45NiUgb2YgaG91c2Vob2xkcyB3aXRoaW4gdGhlIHByaW9yaXR5IGdyb3VwIGRvIG5vdCBoYXZlIGltcHJvdmVkIHNhbml0YXRpb24gd2hlcmVhcyBmb3IgaG91c2Vob2xkcyBvdXRzaWRlIG9mIHRoZSBwcmlvcml0eSBncm91cCwgdGhpcyBwZXJjZW50YWdlIGlzIDEuNDIlLiANCg0KVGhlIGZvdXJ0aCBjb2x1bW4gc2hvd3MgdGhlIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIGFuZCBob3VzZWhvbGRzIG91dHNpZGUgb2YgaXQuIFRvIGNvbnRpbnVlIHRoZSBleGFtcGxlLCBob3VzZWhvbGRzIGluIHRoZSBwcmlvcml0eSBncm91cCBhcmUgMTA3LjU1JSBtb3JlIGxpa2VseSB0byBub3QgaGF2ZSBhY2Nlc3MgdG8gaW1wcm92ZWQgc2FuaXRhdGlvbiB0aGFuIGhvdXNlaG9sZHMgb3V0c2lkZSBvZiB0aGUgcHJpb3JpdHkgZ3JvdXAuIFRoZSB0YWJsZSBpcyBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGlzIGNvbHVtbi4gDQoNClRoZSBsYXN0IGNvbHVtbiBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc3VydmV5ZWQgcG9wdWxhdGlvbiB0aGF0IHRoZSB2YXJpYWJsZSBjb3JyZXNwb25kcyB0by4gU28sIGluIHNwaXRlIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIGhhdmluZyBtdWNoIGxvd2VyIGFjY2VzcyB0byBpbXByb3ZlZCBzYW5pdGF0aW9uLCB0aGlzIHZhcmlhYmxlIG9ubHkgYXBwbGllcyB0byAyLjIzJSBvZiB0aGUgdG90YWwgcG9wdWxhdGlvbiwgbWVhbmluZyB0aGF0IHdoaWxzdCB0aGlzIGluZGljYXRvciBtaWdodCBiZSB2ZXJ5IHByZWRpY3RpdmUgb2YgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAsIHVzaW5nIGl0IG9uIGl0cyBvd24gd291bGQgbGVhZCB0byBoaWdoIGV4Y2x1c2lvbiBlcnJvcnMgYXMgaXQgb25seSBhcHBsaWVzIHRvIGEgc21hbGwgcHJvcG9ydGlvbiBvZiB0aGUgcG9wdWxhdGlvbi4gU29ydGluZyB0aGUgdGFibGUgYnkgKipgJV9zYW1wbGVgKiouIA0KDQo8YnI+DQoNCg0KYGBge3IgZHQtY29tcGFyaXNvbi1kZW1vZ3JhcGhpYy1lbnZpcm9ubWVudGFsfQ0KDQpqcyA8LSBjKA0KICAiZnVuY3Rpb24oc2V0dGluZ3MpeyIsDQogICIgIHZhciBkYXRhdGFibGUgPSBzZXR0aW5ncy5vSW5zdGFuY2UuYXBpKCk7IiwNCiAgIiAgdmFyIHRhYmxlID0gZGF0YXRhYmxlLnRhYmxlKCkubm9kZSgpOyIsDQogICIgIHZhciBjYXB0aW9uID0gJ2hoX3NpemUgc2hvd3MgdGhlIHBvcHVsYXRpb24gbWVhbiBpbiB0aGUgJV9zYW1wbGUgY29sdW1uJyIsDQogICIgICQodGFibGUpLmFwcGVuZCgnPGNhcHRpb24gc3R5bGU9XCJjYXB0aW9uLXNpZGU6IGJvdHRvbVwiPicgKyBjYXB0aW9uICsgJzwvY2FwdGlvbj4nKTsiLA0KICAifSINCikNCg0Kc3VydmV5ICU+JSANCiAgbXV0YXRlKGNoaWxkcmVuXzBfNCA9IGlmZWxzZShjaGlsZHJlbl8wXzQgPiAwLCAxLCAwKSkgJT4lIA0KICBzZWxlY3QobWF0Y2hlcygic2hvY2tzX3xob2hfZmVtYWxlfHJ1cmFsfG5vdF9pbXByb3ZlZHxhZ3JpX2FjdGl2aXR5fGluY29tZV9tc198c2l6ZXxjaGlsZHJlbnxkaXNhYmlsaXR5IiksIHN1cnZleV9pZCkgJT4lIA0KICBzZWxlY3QoLXNob2Nrc19ub25lLCAtY3JwX2xhbmRzaXplLCAtcnVyYWx1cmJhbikgJT4lIA0KICBsZWZ0X2pvaW4oc3VydmV5ICU+JSBzZWxlY3QoaG9oX2VkdWNhdGlvbiwgaG9oX2FnZSwgcmVzaWRlbmNlX3R5cGUsIHN1cnZleV9pZCkgJT4lIA0KICAgICAgICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gIm9sZF92YXIiLCB2YWx1ZXNfdG8gPSAidmFyIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh2YWx1ZSA9IDEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1vbGRfdmFyKSAlPiUgDQogICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXIsIHZhbHVlc19mcm9tID0gdmFsdWUsIHZhbHVlc19maWxsID0gMCksIGJ5ID0gInN1cnZleV9pZCIpICU+JSANCiAgc2VsZWN0KC1gTkFgKSAlPiUgIA0KICBsZWZ0X2pvaW4oc3VydmV5ICU+JSBzZWxlY3QocHJpb3JpdHksIHN1cnZleV9pZCksIGJ5ID0gInN1cnZleV9pZCIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKC1zdXJ2ZXlfaWQsIC1wcmlvcml0eSksIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKGNvdW50ID0gMSkgJT4lICANCiAgZ3JvdXBfYnkodmFyLCBwcmlvcml0eSkgJT4lIA0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4odmFsdWUpKSAlPiUgDQogIG11dGF0ZShwcmlvcml0eSA9IHJlY29kZShwcmlvcml0eSwgYDFgID0gInByaW9yaXR5IiwgYDBgID0gIm5vdF9wcmlvcml0eSIpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBwcmlvcml0eSwgdmFsdWVzX2Zyb20gPSBtZWFuKSAlPiUgDQogIG11dGF0ZShkaWZmX3BjID0gcm91bmQoKHByaW9yaXR5IC0gbm90X3ByaW9yaXR5KSAvIG5vdF9wcmlvcml0eSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICBsZWZ0X2pvaW4oc3VydmV5X2xvbmcgJT4lDQogICAgICAgICAgICAgIGxlZnRfam9pbihzdXJ2ZXkgJT4lIHNlbGVjdChjb21iaW5lZF93dCwgc3VydmV5X2lkKSwgYnkgPSAic3VydmV5X2lkIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShjb3VudCA9IGlmZWxzZSh2YWx1ZSA+IDAsIDEsIDApKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNvdW50ID09IDEpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkodmFyKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb21iaW5lZF93dCkpLCBieSA9ICJ2YXIiKSAlPiUgDQogIG11dGF0ZShwY19zYW1wbGUgPSByb3VuZChjb3VudCAvIHN1bShzdXJ2ZXkkY29tYmluZWRfd3QpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhwcmlvcml0eSwgbm90X3ByaW9yaXR5KSwgfnJvdW5kKC54ICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lICANCiAgbXV0YXRlKHBjX3NhbXBsZSA9IGNhc2Vfd2hlbih2YXIgPT0gImNoaWxkcmVuXzBfNCIgfiByb3VuZChzdW0oc3VydmV5W3doaWNoKHN1cnZleSRjaGlsZHJlbl8wXzQgPiAwKSwgMzMxXSkgLyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHN1cnZleSRjb21iaW5lZF93dCkgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyID09ICJoaF9zaXplIiB+IDUuMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gcGNfc2FtcGxlKSwgDQogICAgICAgICB2YXIgPSBzdHJfcmVwbGFjZSh2YXIsICJtcyIsICJzb3VyY2UiKSkgJT4lICANCiAgYXJyYW5nZShkZXNjKGRpZmZfcGMpKSAlPiUNCiAgc2VsZWN0KHZhcmlhYmxlID0gdmFyLCBtZWFuX3ByaW9yaXR5ID0gcHJpb3JpdHksIG1lYW5fbm90X3ByaW9yaXR5ID0gbm90X3ByaW9yaXR5LCANCiAgICAgICAgIGAlX2RpZmZlcmVuY2VgID0gZGlmZl9wYywgYCVfc2FtcGxlYCA9IHBjX3NhbXBsZSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgIGluaXRDb21wbGV0ZSA9IEpTKGpzKSwjVGhpcyB3aWxsIGF2b2lkIGxvb3Bpbmcgb2YgdGhlIGNhcHRpb24gd2hlbiB0aGVyZSBpcyBwYWdpbmF0aW9uDQogICAgICAgICAgICAgIGhlYWRlckNhbGxiYWNrID0gRFQ6OkpTKCJmdW5jdGlvbih0aGVhZCkgeyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiICAkKHRoZWFkKS5jc3MoJ2ZvbnQtc2l6ZScsICcuOGVtJyk7IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKSksDQogIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICJjYXB0aW9uLXNpZGU6IHRvcDsgY29sb3I6IGJsYWNrOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTMwJTsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3NzaWJsZSBjb21wb25lbnQgb2YgYSBiZW5lZmljaWFyeSBwcm9maWxlIiksIA0KICApICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCg0KYGBgDQoNCjxicj4NCg0KQXMgZXhwZWN0ZWQsIGdpdmVuIHRoYXQgdGhlIHByaW9yaXR5IGdyb3VwaW5nIGlzIGxhcmdlbHkgYmFzZWQgb24gdGhlIEZvb2QgQ29uc3VtcHRpb24gU2NvcmUsIENvcGluZyBTdHJhdGVnaWVzIEluZGV4IGFuZCB0aGUgRm9vZCBJbnNlY3VyaXR5IEV4cGVyaWVuY2UgU2NhbGUsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgbGVhc3QgbGlrZWx5IChhcyBjYW4gYmUgc2VlbiBieSB0aGVpciBuZWdhdGl2ZSAqKmAlX2RpZmZlcmVuY2VgKiopIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBob3VzZWhvbGRzIGluIHRoZSBwcmlvcml0eSBncm91cCBhcmUgdGhlIGhvdXNlaG9sZCBoZWFkIGhhdmluZyBjb21wbGV0ZWQgaGlnaGVyIGVkdWNhdGlvbiwgaGF2aW5nIGEgc3RhYmxlIHNvdXJjZSBvZiBub24tYWdyaWN1bHR1cmFsIGluY29tZSwgaGF2aW5nIHRoZSBtYWluIGluY29tZSBzb3VyY2UgYmUgZnJvbSBsaXZlc3RvY2sgYW5kIGhhdmluZyBzZWxmLWVtcGxveW1lbnQgb3Igbm9uLXdvcmsgKHJlbnRzIGV0Yy4pIGJlaW5nIHRoZSBtYWluIGluY29tZSBzb3VyY2UuIA0KDQpQYXJ0bmVycyBhcmUgZW5jb3VyYWdlZCB0byBtYWtlIHVzZSBvZiB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgYWJvdmUsIGluIGFkZGl0aW9uIHRvIGNvbW11bml0eSBwZXJzcGVjdGl2ZXMgYW5kIHRoZWlyIG93biBleHBlcnQganVkZ2VtZW50LCB0byBmb3JtdWxhdGUgdGhlIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgdGhlaXIgZm9vZCBzZWN1cml0eSBwcm9ncmFtbWVzLiBUaGUgbmV4dCBzZWN0aW9uIG1ha2VzIHVzZSBvZiBkZWNpc2lvbiB0cmVlcyB0byBmaW5kIHdoaWNoIG9mIHRoZXNlIHZhcmlhYmxlcyBhcmUgdGhlIG1vc3QgdXNlZnVsIGluIHNwbGl0dGluZyB0aGUgcG9wdWxhdGlvbiBpbnRvIGhvdXNlaG9sZHMgd2l0aGluIHRoZSBwcmlvcml0eSBncm91cCBhbmQgdGhvc2Ugb3V0c2lkZSBvZiBpdC4gDQoNCg0KPGJyPjxicj4NCg0KIyMjIDEuNCBEZWNpc2lvbiB0cmVlcw0KDQpgYGB7ciBkZi10cmVlLXJ1bGVzfQ0KDQp0cmVlNCA8LSBzdXJ2ZXkgJT4lIA0KICBycGFydChwcmlvcml0eSB+ICBzaG9ja3NfbG9zdHdvcmsgKyBzaG9ja3Nfc2lja25lc3NkZWF0aCArIHNob2Nrc19mb29kcHJpY2VzICsgc2hvY2tzX2NvbmZsaWN0ICsgc2hvY2tzX2NhbnR3b3JrYnVzaW5lc3MgKw0KICAgICAgICAgIHNob2Nrc19uYXR1cmFsaGF6YXJkICsgc2hvY2tzX2FjY2Vzc21hcmtldCArIHNob2Nrc19wcmljZXNvdGhlciArIHNob2Nrc19vdGhlciArIHJ1cmFsICsgbm90X2ltcHJvdmVkX3Nhbml0YXRpb24sDQogICAgICAgIGRhdGEgPSAuLCAgd2VpZ2h0cyA9IGNvbWJpbmVkX3d0ICwgY3AgPSAwLjAxKQ0KDQp0cmVlNiA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGUoY2hpbGRyZW5fMF80ID0gaWZlbHNlKGNoaWxkcmVuXzBfNCA+IDAsIDEsIDApKSAlPiUgDQogIHJwYXJ0KHByaW9yaXR5IH4gY2hpbGRyZW5fMF80ICsgaG9oX2ZlbWFsZSArIGhvaF9lZHVjYXRpb24gKyBob2hfYWdlLCBkYXRhID0gLiwgd2VpZ2h0cyA9IGNvbWJpbmVkX3d0LCBjcCA9IC4wMDg4KQ0KDQpzdXJ2ZXkgPC0gc3VydmV5ICU+JSANCiAgbXV0YXRlKHJ1bGU0ID0gcm93Lm5hbWVzKHRyZWU0JGZyYW1lKVt0cmVlNCR3aGVyZV0pICU+JSANCiAgbGVmdF9qb2luKHJwYXJ0LnJ1bGVzLnRhYmxlKHRyZWU0KSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihMZWFmID09IFRSVUUpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKHJ1bGU0ID0gUnVsZSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShydWxlNCkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2Uoc3VicnVsZXM0ID0gcGFzdGUoU3VicnVsZSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAicnVsZTQiKSAlPiUgDQogIG11dGF0ZShydWxlNiA9IHJvdy5uYW1lcyh0cmVlNiRmcmFtZSlbdHJlZTYkd2hlcmVdKSAlPiUgDQogIGxlZnRfam9pbihycGFydC5ydWxlcy50YWJsZSh0cmVlNikgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoTGVhZiA9PSBUUlVFKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShydWxlNiA9IFJ1bGUpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkocnVsZTYpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHN1YnJ1bGVzNiA9IHBhc3RlKFN1YnJ1bGUsIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gInJ1bGU2IikNCg0KDQpgYGANCg0KDQpUaGlzIHNlY3Rpb24gZm9jdXNlcyBvbiB0aGUgY3JlYXRpb24gb2Ygc2ltcGxlIHRvb2xzIHRvIGFpZCBpbiB0aGUgaWRlbnRpZmljYXRpb24gb2YgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAuIFRoaXMgaW52b2x2ZXMgbmFycm93aW5nIGRvd24gdGhlIGxpc3Qgb2YgMzYgdmFyaWFibGVzIGluIHRoZSByZWZlcmVuY2UgdGFibGUgYWJvdmUgdG8gZGV2ZWxvcCB0d28gc2ltcGxlIGRlY2lzaW9uIHRyZWVzLCBvbmUgZm9jdXNlZCBvbiBhIGhvdXNlaG9sZCdzIGVudmlyb25tZW50IGFuZCBjaXJjdW1zdGFuY2VzIGFuZCB0aGUgb3RoZXIgb24gYSBob3VzZWhvbGQncyBkZW1vZ3JhcGhpY3MuIA0KDQpCb3RoIHRoZXNlIHRyZWVzIGhhdmUgYmVlbiBrZXB0IHNpbXBsZSBhcyBtYWtpbmcgdGhlbSBkZWVwZXIgKGkuZS4gYnkgaW5jbHVkaW5nIGFkZGl0aW9uYWwgdmFyaWFibGVzIGFuZCBtb3JlIG5vZGVzKSBwcm92aWRlcyB2ZXJ5IGxpbWl0ZWQgZ2FpbnMgaW4gZXhjaGFuZ2UgZm9yIGEgbG90IG9mIGFkZGVkIGNvbXBsZXhpdHkuIEFkZGl0aW9uYWxseSwgYXMgZGVjaXNpb24gdHJlZXMgZ3JvdyBsYXJnZXIsIHRoZXkgZ2V0IG11Y2ggbGVzcyBpbnRlcnByZXRhYmxlLiANCg0KRWFjaCB0cmVlIHN0YXJ0cyBhdCB0aGUgcm9vdCwgbm9kZSAqWzFdKiAgaW4gdGhpcyBjYXNlLCB3aGljaCBjb250YWlucyB0aGUgZW50aXJlIHBvcHVsYXRpb24uIEZyb20gdGhlcmUsIGl0IGJyYW5jaGVzIG91dCBiYXNlZCBvbiB0aGUgdmFyaW91cyBjb25kaXRpb25zIGF0IGVhY2ggbm9kZSB1bnRpbCBpdCB0ZXJtaW5hdGVzIGluIGZvdXIgZ3JvdXBzICg0LCA1LCA2IGFuZCA3IGluIHRoZSB0cmVlIGJlbG93KS4gV2l0aGluIGVhY2ggYmx1ZSBzcXVhcmUsIHRoZSBmaWd1cmUgaW4gKipib2xkKiogc2hvdyB0aGUgKipwZXJjZW50YWdlIG9mIGVhY2ggZ3JvdXAgdGhhdCBhcmUgcHJpb3JpdHkgaG91c2Vob2xkcyoqIGFuZCB0aGUgZmlndXJlcyBpbiAqaXRhbGljcyogc2hvdyB0aGUgKnBlcmNlbnRhZ2Ugb2YgdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiogaW4gZWFjaCBub2RlLiANCg0KVGhlIGZpcnN0IHRyZWUsIGRlYWxpbmcgd2l0aCBhIGhvdXNlaG9sZCdzIGVudmlyb25tZW50IGFuZCBjaXJjdW1zdGFuY2VzIGlzIGNvbXByaXNlZCBvZiB0aHJlZSBzcGxpdHMgLS0gd2hldGhlciBhIGhvdXNlaG9sZCBpcyBpbiBhIHJ1cmFsIGFyZWEsIHdoZXRoZXIgdGhleSBoYXZlIGV4cGVyaWVuY2VkIHZpb2xlbmNlLCBpbnNlY3VyaXR5IG9yIGNvbmZsaWN0IGFuZCB3aGV0aGVyIHRoZXkgaGF2ZSBsb3N0IHdvcmsgb3IgZW1wbG95bWVudCBvcHBvcnR1bml0aWVzLiANCg0KPGJyPg0KDQoqKkRlY2lzaW9uIHRyZWUgLS0gZW52aXJvbm1lbnQgYW5kIGNpcmN1bXN0YW5jZXMqKg0KIVtdKGRlY2lzaW9uX3RyZWUucG5nKQ0KPGJyPg0KDQpUaGUgcGVyY2VudGFnZSBvZiBwcmlvcml0eSBob3VzZWhvbGRzIGluIHJ1cmFsIGFyZWFzIGlzIG11Y2ggaGlnaGVyIHRoYW4gaW4gdXJiYW4gb25lcyAoMzcuNiUgdnMgMjYuMSUpLiBGb3IgcnVyYWwgYXJlYXMsIHRoZSBpbmRpY2F0b3IgdGhhdCBiZXN0IGRpc3Rpbmd1aXNoZXMgcHJpb3JpdHkgaG91c2Vob2xkcyBpcyB3aGV0aGVyIG9yIHRoZXkgaGF2ZSBkaXJlY3RseSBleHBlcmllbmNlZCB2aW9sZW5jZSwgaW5zZWN1cml0eSBvciBjb25mbGljdCBpbiB0aGUgcGFzdCB0aHJlZSBtb250aHMuIFRoZSBmYWN0b3IgdGhhdCBiZXN0IGRpc3Rpbmd1aXNoZXMgcHJpb3JpdHkgaG91c2Vob2xkcyBpbiB1cmJhbiBhcmVhcyBpcyB3aGV0aGVyIG9yIG5vdCB0aGV5IGhhdmUgbG9zdCB3b3JrIG9yIGVtcGxveW1lbnQgb3Bwb3J0dW5pdGllcyBpbiB0aGUgcGFzdCB0aHJlZSBtb250aHMuICANCg0KVGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBkZWNpc2lvbiB0cmVlIGlzIG5vdCBleGFjdGx5IHNwZWN0YWN1bGFyIC0tIGlmIGEgcGFydG5lciB3YW50ZWQgdG8gdGFyZ2V0IGFuIGVudGlyZSBjb21tdW5pdHksIHRoZSB0aHJlc2hvbGQgZm9yIGJsYW5rZXQgY292ZXJhZ2Ugd291bGQgYmUgYXJvdW5kIDc1JSBvciA4MCUgb2YgaG91c2Vob2xkcyBiZWluZyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAsIHdoaWNoIG5vbmUgb2YgdGhlIHRlcm1pbmFsIG5vZGVzIGFjaGlldmUuIEJ1dCB0aGUgdHJlZSBpcyB2ZXJ5IHVuZGVyc3RhbmRhYmxlIGF0IGxlYXN0IHByb3ZpZGVzIHNvbWUgZGlyZWN0aW9uIGZvciBpZGVudGlmeWluZyBiZW5lZmljaWFyaWVzIGF0IHRoZSBjb21tdW5pdHkgbGV2ZWwgb25jZSBnZW9ncmFwaGljIHByaW9yaXRpc2F0aW9uIGhhcyBiZWVuIGNvbmR1Y3RlZCAod2hpY2ggaXMgdGhlIHRvcGljIG9mIHNlY3Rpb24gMikuIA0KDQpUaGVzZSBmaW5kaW5ncyBhcmUgYWxzbyBjb25zaXN0ZW50IHdpdGggSUZQUkkncyBzdXJ2ZXkgb24gaG91c2Vob2xkIHdlbGZhcmUgd2hlcmUgcnVyYWwgaG91c2Vob2xkcyB3ZXJlIGZvdW5kIHRvIGJlIG1vcmUgYXNzZXQtcG9vciBhbmQgbGVzcyByZXNpbGllbnQgdGhhbiB1cmJhbiBvbmVzLiBIb3dldmVyLCBtdWNoIG1vcmUgd29yayByZW1haW5zIHRvIGJlIGRvbmUgb24gdHJpYW5ndWxhdGluZyB0aGUgRkFPLVdGUCBzdXJ2ZXkgd2l0aCB0aGUgSUZQUkkgb25lLCB3aGljaCB3YXMgbXVjaCBtb3JlIGNvbXByZWhlbnNpdmUgaW4gc2NvcGUgYW5kIHNjYWxlLiANCg0KVGhlIHNlY29uZCB0cmVlIGJlbG93IG1ha2VzIHVzZSBvZiBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMgKGFnZSBvZiBoZWFkIG9mIGhvdXNlaG9sZCwgd2hldGhlciBvciBub3QgdGhlIGhlYWQgb2YgdGhlIGhvdXNlaG9sZCBpcyBmZW1hbGUgZXRjLikuIFRoZXNlIGhhdmUgYmVlbiB0cmVhdGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgZW52aXJvbm1lbnRhbCBhbmQgY2lyY3Vtc3RhbnRpYWwgdmFyaWFibGVzIGFib3ZlIGFzIGNvbWJpbmluZyB0aGVtIGxlZCB0byB0cmVlcyB0aGF0IGRpZCBub3QgbWFrZSBzZW5zZSBpLmUuIHdoZXRoZXIgb3Igbm90IGEgaG91c2Vob2xkIGhhcyBjaGlsZHJlbiB1bmRlciA1IHNob3VsZCBoYXZlIG5vIGJlYXJpbmcgb24gd2hldGhlciBvciBub3QgdGhleSBsb3N0IGFjY2VzcyB0byBtYXJrZXRzIGluIHRoZSBwYXN0IHRocmVlIG1vbnRocy4gQm90aCB0cmVlcyBzdGFydCBmcm9tIHRoZSBzYW1lIHJvb3QgaS5lLiAxMDAlIG9mIHRoZSBwb3B1bGF0aW9uLiANCg0KSW4gdGhlIHNlY29uZCB0cmVlIGJlbG93LCB3aGljaCBzcGxpdHMgdGhlIHBvcHVsYXRpb24gaW50byB0aHJlZSB0ZXJtaW5hbCBub2RlcyAoQiwgRCBhbmQgRSksIGhvdXNlaG9sZHMgd2hvc2UgaGVhZHMgaGF2ZSBub3QgY29tcGxldGVkIHNlY29uZGFyeSBhbmQvb3IgaGlnaGVyIGVkdWNhdGlvbiAqYW5kKiBoYXZlIGNoaWxkcmVuIHVuZGVyIDUgeWVhcnMgb2YgYWdlIGFyZSBtb3N0IGxpa2VseSB0byBmYWxsIGludG8gdGhlIHByaW9yaXR5IGdyb3VwICg0Ni44JSkuIEhvdXNlaG9sZHMgd2hvc2UgaGVhZHMgaGF2ZSBjb21wZXRlZCBzZWNvbmRhcnkgYW5kL29yIGhpZ2hlciBlZHVjYXRpb24gYXJlIGxlYXN0IGxpa2VseSB0byBmYWxsIGludG8gdGhlIHByaW9yaXR5IGdyb3VwLCBpcnJlc3BlY3RpdmUgb2YgdGhlIGFnZSBvZiB0aGVpciBjaGlsZHJlbiBvciBldmVuIGlmIHRoZXkgaGF2ZSBjaGlsZHJlbi4gIA0KDQo8YnI+DQoNCioqRGVjaXNpb24gdHJlZSAtLSBkZW1vZ3JhcGhpY3MqKg0KIVtdKGRlY2lzaW9uX3RyZWVfZGVtb2dyYXBoaWNzLnBuZykNCjxicj4NCg0KVGhlc2UgZGVjaXNpb24gdHJlZXMgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIG5vdCB0byBkaXJlY3QgZGVjaXNpb25zIGluIHBhcnRuZXJzJyBwcm9ncmFtbWVzLCBidXQgbW9yZSB0byBpbmZvcm0gdGhlbSwgYW5kIHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBhYnNvbHV0ZXMgLS0gdGhlcmUgYXJlIGEgd2lkZSB2YXJpZXR5IG9mIGNvbnRleHRzIGluIE15YW5tYXIgYW5kIGVhY2ggY29tbXVuaXR5IHdpbGwgbGlrZWx5IGhhdmUgYWRkaXRpb25hbCByZWxldmFudCBjcml0ZXJpYS4gDQoNCkJ1dCB0aGUgYXBwbGljYXRpb24gb2YgdGhlIGNvbmRpdGlvbnMgc2V0IGluIHRoaXMgdHJlZSBhbmQgdGhlIGZpcnN0IG9uZSAoaW4gYmx1ZSkgd2lsbCBsZWFkIHRvIG11Y2ggbG93ZXIgaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gZXJyb3JzIGluIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbi4gVGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciByZW1haW5zIG9wZW4gdG8gbW9yZSBkYXRhIHRoYXQgd2lsbCBoZWxwIGltcHJvdmUgb3VyIGNvbGxlY3RpdmUgdW5kZXJzdGFuZGluZyBvZiBmb29kIGluc2VjdXJpdHkgaW4gTXlhbm1hci4gDQoNCg0KPGJyPjxicj4NCg0KIyMjIDEuNSBFeGNlcHRpb25zIGZvciB0YXJnZXRpbmcgYWdyaWN1bHR1cmFsIGhvdXNlaG9sZHMNCg0KUmV0dXJuaW5nIG1vbWVudGFyaWx5IHRvIHRoZSBmaXJzdCB0cmVlIG9uIGVudmlyb25tZW50YWwgYW5kIGNpcmN1bXN0YW50aWFsIHZhcmlhYmxlcyAoaW4gYmx1ZSksIDY0LjclIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGlzIGluIHRoZSB0cmVlIG5vZGUgKls2XSogKHRoZSBub2RlcyBhcmUgYWxsIG51bWJlcmVkIGluIHRoZSBkZWNpc2lvbiB0cmVlIGFib3ZlKSAtLSB3aXRoaW4gdGhpcyBncm91cCBhcmUgaG91c2Vob2xkcyB3aG8gcmVzaWRlIGluIHJ1cmFsIGFyZWFzIGJ1dCBoYXZlIG5vdCBiZWVuIGFmZmVjdGVkIGJ5IHZpb2xlbmNlLCBjb25mbGljdCBvciBpbnNlY3VyaXR5LiBHaXZlbiB0aGF0IHRoaXMgaXMgYSBzaWduaWZpY2FudCBjaHVuayBvZiB0aGUgcG9wdWxhdGlvbiB3aGVyZSwgd2l0aCByZWZlcmVuY2UgdG8gdGhlIHBsb3QgYmVsb3csIDc4JSBvZiB0aGUgcG9wdWxhdGlvbiBpcyBpbnZvbHZlZCBpbiBhZ3JpY3VsdHVyZSwgYW4gZXhjZXB0aW9uIGNhbiBiZSBtYWRlIGluIHRoaXMgb25lIGluc3RhbmNlLCB0byBzdXBwb3J0IHBhcnRuZXJzIHdobyBtaWdodCB3YW50IHRvIHNlbGVjdCBiZW5lZmljaWFyaWVzIHdpdGhpbiB0aGUgbGFyZ2UgZ3JvdXAgb2YgYWdyaWN1bHR1cmFsIGhvdXNlaG9sZHMgd2hvIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQgYnkgY29uZmxpY3QuICANCg0KSXQgbXVzdCBzdGlsbCBiZSBtZW50aW9uZWQgdGhhdCBhaWQgbXVzdCBmaXJzdCBmbG93IHRvIHRoZSBob3VzZWhvbGRzIGluIG5vZGUgKls3XSosIHdoZXJlIHRoZSBwcm9wb3J0aW9uIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIGlzIGhpZ2hlc3QuIE9ubHkgYWZ0ZXIgdGhlIG5lZWRzIG9mIHRoaXMgcG9wdWxhdGlvbiBhcmUgbWV0IHNob3VsZCBob3VzZWhvbGRzIGluIG5vZGUgKls2XSogYmUgdGFyZ2V0ZWQuIA0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtcGMtYWdyaX0NCnN1cnZleSAlPiUgDQogIG11dGF0ZShhZ3JpX2hoZCA9IGFncmlfaGhkICogY29tYmluZWRfd3QpICU+JSANCiAgZ3JvdXBfYnkocnVsZTQpICU+JSANCiAgc3VtbWFyaXNlKHN1bSA9IHN1bShhZ3JpX2hoZCksIA0KICAgICAgICAgICAgY29tYmluZWRfd3QgPSBzdW0oY29tYmluZWRfd3QpKSAlPiUgDQogIG11dGF0ZShwY19hZyA9IHN1bSAvIGNvbWJpbmVkX3d0LCANCiAgICAgICAgIHBjID0gY29tYmluZWRfd3QgLyBzdW0oY29tYmluZWRfd3QpKSAlPiUgDQogIG11dGF0ZShydWxlNCA9IGZjdF9yZXYocnVsZTQpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gcnVsZTQsIGZpbGwgPSBwY19hZykpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHJvdW5kKHBjX2FnLCBkaWdpdHMgPSAzKSkpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4xKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgYmVnaW4gPSAwLjE1KSArICAgDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIGxhYnMoeCA9ICJQZXJjZW50IG9mIHRvdGFsIHBvcHVsYXRpb24iLCANCiAgICAgICB5ID0gIlRyZWUgbm9kZSIsDQogICAgICAgdGl0bGUgPSAiU2hhcmUgb2YgYWdyaWN1bHR1cmFsIGhvdXNlaG9sZHMgYnkgdHJlZSBub2RlIiwgDQogICAgICAgZmlsbCA9ICIlIGFncmlcbmhoZCIpICsgDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgDQogIGV4cGFuZF9saW1pdHMoeCA9IC42OCkNCmBgYA0KDQo8YnI+IA0KDQpUaGUgdHJlZSBiZWxvdyBjYXJyaWVzIG9uIGZyb20gbm9kZSAqWzZdKiBvZiB0aGUgbWFpbiBkZWNpc2lvbiB0cmVlIG9uIGVudmlyb25tZW50YWwgYW5kIGNpcmN1bXN0YW50aWFsIHZhcmlhYmxlcy4gV2l0aGluIHRoaXMgZ3JvdXAgb2YgcnVyYWwgaG91c2Vob2xkcyBub3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QgKDY0LjclIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uKSwgaWRlbnRpZnlpbmcgaG91c2Vob2xkcyB3aG8gaGF2ZSBsb3N0IGFjY2VzcyB0byBtYXJrZXRzIGR1ZSB0byBjb25mbGljdCwgaW5mcmFzdHJ1Y3R1cmUgZGFtYWdlIG9yIG90aGVyIGFjY2VzcyBpc3N1ZXMgYW5kIGhvdXNlaG9sZHMgd2hvIGhhdmUgYmVlbiBhZmZlY3RlZCBieSBuYXR1cmFsIGhhemFyZHMgKHRoZSBtb3N0IGNvbW1vbiBvZiB3aGljaCBpcyBmbG9vZGluZykgaW1wcm92ZXMgdGhlIGNoYW5jZXMgb2YgdGFyZ2V0aW5nIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIHRvIHNsaWdodGx5IGFib3ZlIDUwJS4gDQoNCkFueSBmdXJ0aGVyIGNvbmRpdGlvbnMgYXBwbGllZCBvbiB0aGUgdHJlZSBvbmx5IHJlc3VsdCBpbiBleHRyZW1lbHkgbWFyZ2luYWwgZ2FpbnMuIA0KDQo8YnI+DQoNCioqRGVjaXNpb24gdHJlZSAtLSBmcm9tIHRyZWUgbm9kZSBbNl0qKg0KIVtdKGFncmljdWx0dXJhbF9leGNlcHRpb24ucG5nKQ0KDQo8YnI+DQoNClRvIGZ1cnRoZXIgaW5mb3JtIHRoZSBzZWxlY3Rpb24gb2YgYmVuZWZpY2lhcmllcyBpbiB0aGVzZSBhcmVhcywgdGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIGNvZWZmaWNpZW50cyBvZiBlbnZpcm9ubWVudGFsIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMgb24gZm9vZCBpbnNlY3VyaXR5IHdpdGhpbiB0aGUgaG91c2Vob2xkcyBpbiBub2RlICpbNl0qLiBUaGUgbW9yZSBwb3NpdGl2ZSAobW9yZSByZWQpIHRoZSBjb2VmZmljaWVudCwgdGhlIGhpZ2hlciB0aGUgaW1wYWN0IG9uIGZvb2QgaW5zZWN1cml0eS4gIA0KDQpUaGUgdmFyaWFibGVzIHdpdGhpbiB0aGUgRkFPLVdGUCBzdXJ2ZXkgbW9zdCBvZiB1c2UgdG8gcGFydG5lcnMgdGFyZ2V0aW5nIHByaW9yaXR5IGhvdXNlaG9sZHMgaW4gbm9kZSAqWzZdKiBhcmUgd2hldGhlciBvciBub3QgYSBob3VzZWhvbGQgaGFzIGltcHJvdmVkIHNhbml0YXRpb24gYW5kIHRoZSBlZHVjYXRpb25hbCBhdHRhaW5tZW50IG9mIHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQuIFRoZSBtb3N0IGltcG9ydGFudCBzaG9ja3MgZm9yIHRoaXMgZ3JvdXAgd2VyZSBuYXR1cmFsIGhhemFyZHMgYW5kIHRoZSBsb3NzIG9mIHdvcmsgb3IgZW1wbG95bWVudCBvcHBvcnR1bml0aWVzLiANCg0KPGJyPg0KDQpgYGB7ciBjb2VmLXBsb3Qtbm9kZTZ9DQpzdXJ2ZXkgJT4lIGZpbHRlcihydWxlNCA9PSA2KSAlPiUgDQogIHNlbGVjdChjb250YWlucygic2hvY2tzXyIpLCBub3RfaW1wcm92ZWRfc2FuaXRhdGlvbiwgY29udGFpbnMoImluY29tZV9tc18iKSwNCiAgICAgICAgIGhvaF9lZHVjYXRpb24sIGhvaF9mZW1hbGUsIGhvaF9hZ2UsIGZzX3Njb3JlNCwgY2hpbGRyZW5fMF80KSAlPiUgDQogIHNlbGVjdCgtYyhzaG9ja3NfY29uZmxpY3QsIGluY29tZV9tc19maXNoZXJpZXMpKSAlPiUgDQogIG11dGF0ZShmc19zY29yZTQgPSBsb2coZnNfc2NvcmU0KSkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmU0ID0gaWZlbHNlKGlzLmluZmluaXRlKGZzX3Njb3JlNCksIDAsIGZzX3Njb3JlNCkpICU+JSANCiAgbG0oZnNfc2NvcmU0IH4gLiwgZGF0YSA9IC4pICU+JSANCiAgICB0aWR5KGNvbmYuaW50ID0gVFJVRSkgJT4lDQogICAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIA0KICAgIG11dGF0ZSh0ZXJtID0gc3RyX3JlcGxhY2UodGVybSwgImluY29tZV9tcyIsICJpbmNvbWVfc291cmNlIiksDQogICAgICAgICAgIHRlcm0gPSBzdHJfcmVwbGFjZSh0ZXJtLCAiaG9oX2FnZSIsICIiKSwNCiAgICAgICAgICAgdGVybSA9IHN0cl9yZXBsYWNlKHRlcm0sICJob2hfZWR1Y2F0aW9uIiwgIiIpLCANCiAgICAgICAgICAgdGVybSA9IGZjdF9yZW9yZGVyKHRlcm0sIGVzdGltYXRlKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gdGVybSwgY29sb3VyID0gZXN0aW1hdGUpKSArIA0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArDQogICAgZ2VvbV9wb2ludCgpICsgDQogICAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMikgKw0KICAgIHNjYWxlX2NvbG91cl92aXJpZGlzKG9wdGlvbiA9ICJ0dXJibyIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDguNSksDQogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkgKw0KICAgIGxhYnMoeCA9ICJFc3RpbWF0ZSIsIHkgPSAiIiwgDQogICAgICAgICB0aXRsZSA9ICJDb2VmZmljaWVudCBwbG90IGZvciBob3VzZWhvbGRzIGluIHRyZWUgbm9kZSBbNl0iLCANCiAgICAgICAgIHN1YnRpdGxlID0gIkhpZ2hlciBzY29yZXMgYXJlIG1vcmUgcHJlZGljdGl2ZSBvZiBmb29kIGluc2VjdXJpdHkiKQ0KDQpgYGANCg0KDQo8YnI+PGJyPg0KDQoNCiMjIyAxLjYgSW1wYWN0IG9mIGNvbmZsaWN0IG9uIGZvb2Qgc2VjdXJpdHkNCg0KQ29uZmxpY3QgaGFzIGEgcmVhbCBpbXBhY3Qgb24gZm9vZCBzZWN1cml0eS4gRXhwb3N1cmUgdG8gY29uZmxpY3QgaW4gdGhlc2UgaG91c2Vob2xkcyB3YXMgbGlua2VkIHdpdGggYSBgciByb3VuZChmaWx0ZXIoc3VydmV5LCBzaG9ja3NfY29uZmxpY3QgPT0gMSkgJT4lIHttZWFuKC4kZnNfc2NvcmU0KX0gLSBmaWx0ZXIoc3VydmV5LCBzaG9ja3NfY29uZmxpY3QgPT0gMCkgJT4lIHttZWFuKC4kZnNfc2NvcmU0KX0sIGRpZ2l0cyA9IDMpYCBpbmNyZWFzZSBpbiBzY29yZSwgd2hpY2ggaXMsIG9uIGF2ZXJhZ2UsIGEgYHIgcm91bmQoKGZpbHRlcihzdXJ2ZXksIHNob2Nrc19jb25mbGljdCA9PSAxKSAlPiUge21lYW4oLiRmc19zY29yZTQpfSAtIGZpbHRlcihzdXJ2ZXksIHNob2Nrc19jb25mbGljdCA9PSAwKSAlPiUge21lYW4oLiRmc19zY29yZTQpfSkgLyBmaWx0ZXIoc3VydmV5LCBzaG9ja3NfY29uZmxpY3QgPT0gMCkgJT4lIHttZWFuKC4kZnNfc2NvcmU0KX0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUgaGlnaGVyLg0KDQpUaG91Z2ggdGhlIEZBTy1XRlAgc3VydmV5IHdhcyBub3QgZGV2ZWxvcGVkIHdpdGggbWVhc3VyaW5nIHRoZSBpbXBhY3Qgb2YgY29uZmxpY3QgaW4gbWluZCwgaXQgaXMgbmV2ZXJ0aGVsZXNzIHBvc3NpYmxlIHRvIGNvbnRyb2wgZm9yIHNvbWUgZmFjdG9ycyBhbmQgZXhhbWluZSB0aGUgaW1wYWN0IG9mIGNvbmZsaWN0IG9uIHNldmVyYWwgZ3JvdXBzLiANCg0KVGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBmb29kIGluc2VjdXJpdHkgc2NvcmVzIGJhc2VkIG9uIHdoZXRoZXIgYSBob3VzZWhvbGQgaGFzIGJlZW4gaW1wYWN0ZWQgYnkgY29uZmxpY3Qgb3Igbm90LiBXZSBoYXZlIHNlbGVjdGVkIHRoZSB0d28gbGFyZ2VzdCBncm91cHMgd2l0aGluIHRoZSBydXJhbCBhbmQgdXJiYW4gY29udGV4dCAoZmFybWVycyBhbmQgd29ya2VycyBlbXBsb3llZCBpbiBzdGFibGUsIG5vbi1hZ3JpY3VsdHVyYWwgZW1wbG95bWVudCkgYW5kIGhhdmUgc3BsaXQgdGhlc2UgcG9wdWxhdGlvbnMgYnkgZWR1Y2F0aW9uIGxldmVsLiANCg0KPGJyPg0KDQpgYGB7ciBmYWNldC1jb25mbGljdC1pbXBhY3R9DQpjb25mbGljdF9pbXBhY3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaG9oX2VkdWNhdGlvbiwgc2hvY2tzX2NvbmZsaWN0KSAlPiUgDQogICAgZmlsdGVyKCFpcy5uYShob2hfZWR1Y2F0aW9uKSwNCiAgICAgICAgICAgaG9oX2VkdWNhdGlvbiAhPSAiZWR1X3JlbGlnaW91cyIpICU+JSANCiAgICBzdW1tYXJpc2UobWVhbl9zY29yZSA9IG1lYW4oZnNfc2NvcmU0KSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgbXV0YXRlKHNob2Nrc19jb25mbGljdCA9IHJlY29kZShzaG9ja3NfY29uZmxpY3QsIGAwYCA9ICJubyIsIGAxYCA9ICJ5ZXMiKSwNCiAgICAgICAgICAgc2hvY2tzX2NvbmZsaWN0ID0gZmN0X3JldihzaG9ja3NfY29uZmxpY3QpLA0KICAgICAgICAgICBob2hfZWR1Y2F0aW9uID0gZmN0X3JlbGV2ZWwoaG9oX2VkdWNhdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImVkdV9ub25lIiwgImVkdV9wcmltYXJ5IiwgImVkdV9zZWNvbmRhcnkiLCAiZWR1X2hpZ2hlciIpKSkNCn0NCiAgDQpzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIoaW5jb21lX21zX3N0YWJsZV9ub25fYWcgPT0gMSAmIHJ1cmFsID09IDApICU+JQ0KICBjb25mbGljdF9pbXBhY3QoKSAlPiUgDQogIG11dGF0ZShjYXRlZ29yeSA9ICJ1cmJhbl93b3JrZXJzIikgJT4lIA0KICByYmluZCgNCiAgICBzdXJ2ZXkgJT4lIA0KICAgICAgZmlsdGVyKGluY29tZV9tc19hZ3JpY3VsdHVyZSA9PSAxICYgcnVyYWwgPT0gMSkgJT4lIA0KICAgICAgY29uZmxpY3RfaW1wYWN0KCkgJT4lIA0KICAgICAgbXV0YXRlKGNhdGVnb3J5ID0gInJ1cmFsX2Zhcm1lcnMiKQ0KICApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl9zY29yZSwgeSA9IGhvaF9lZHVjYXRpb24sIGZpbGwgPSBzaG9ja3NfY29uZmxpY3QpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG1lYW5fc2NvcmUsIDMpKSwgDQogICAgICAgICAgICBzaXplID0gMy41LCBoanVzdCA9ICJpbndhcmQiLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArDQogIGxhYnMoeCA9ICJNZWFuIGZvb2QgaW5zZWN1cml0eSBzY29yZSIsIHkgPSAiRWR1Y2F0aW9uIGxldmVsLCBob3VzZWhvbGQgaGVhZCIsDQogICAgICAgZmlsbCA9ICJzaG9jazpcbmNvbmZsaWN0IiwNCiAgICAgICB0aXRsZSA9ICJJbXBhY3Qgb2YgY29uZmxpY3Qgb24gZm9vZCBpbnNlY3VyaXR5IiwNCiAgICAgICBzdWJ0aXRsZSA9ICJIaWdoZXIgc2NvcmVzIGluZGljYXRlIGhpZ2hlciBmb29kIGluc2VjdXJpdHkiKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IDAuMTYpICsNCiAgZmFjZXRfd3JhcCh+IGNhdGVnb3J5KQ0KDQpgYGANCg0KPGJyPg0KDQoNClRoZSBmb29kIGluc2VjdXJpdHkgc2NvcmVzIG9mIGFsbCBncm91cHMgZXhjZXB0IG9uZSBhcmUgaGlnaGVyIHdoZW4gYSBob3VzZWhvbGQgaGFzIGV4cGVyaWVuY2VkIGNvbmZsaWN0LiBUaGlzIGJ5IG5vIG1lYW5zIGNvbnN0aXR1dGVzIGEgc2NpZW50aWZpYyBwcm9vZiAoYW5vdGhlciBzdXJ2ZXkgd291bGQgaGF2ZSB0byBiZSBjb25kdWN0ZWQpLCBidXQgaXQgaXMgcG9zc2libGUgdG8gc3RhdGUgd2l0aCBzb21lIGNvbmZpZGVuY2UgdGhhdCBleHBvc3VyZSB0byBjb25mbGljdCBoYXMgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gZm9vZCBzZWN1cml0eS4gVGhlIHNtYWxsIHNhbXBsZSBzaXplIGxpa2VseSByZXN1bHRzIGluIHdpZGVseSBkaXZlcmdpbmcgdmFsdWVzIGluIHNvbWUgY2FzZXM7IGFkZGl0aW9uYWxseSB0aGUgcHVycG9zZSBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgd2FzIG5vdCB0byB1bmRlcnN0YW5kIGNvbmZsaWN0IGR5bmFtaWNzLiANCg0KVGhlIHBsb3QgYmVsb3cgZnVydGhlciBleGFtaW5lcyBvZiB0aGUgaW1wYWN0IG9mIGNvbmZsaWN0IG9uIGZvb2Qgc2VjdXJpdHkuIFRoZSBlc3RpbWF0ZXMgaW4gdGhlIHBsb3QgYmVsb3cgc2hvdyB0aGUgaW1wYWN0IG9mIGV4cG9zdXJlIHRvIGNvbmZsaWN0IG9uIHRoZSB2YXJpb3VzIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcy4gQXMgd2FzIGRvbmUgYWJvdmUsIHRoZSBmb29kIHNlY3VyaXR5IGluZGljZXMgdXNlZCB3ZXJlIHJlLXNjYWxlZCBiZXR3ZWVuIDAgYW5kIDEsIHdpdGggaGlnaGVyIHNjb3JlcyBpbmRpY2F0aW5nIGdyZWF0ZXIgZm9vZCBpbnNlY3VyaXR5LiANCg0KTm90YWJseSwgZXhwb3N1cmUgdG8gY29uZmxpY3QgaGFkIHRoZSBsYXJnZXN0IGltcGFjdCBvbiB0aGUgRm9vZCBJbnNlY3VyaXR5IEV4cGVyaWVuY2UgU2NhbGUgaW4gcnVyYWwgYXJlYXMuIEFsbCB0aGUgZWZmZWN0cyB3ZXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGNvbmZsaWN0IG9uIEZvb2QgQ29uc3VtcHRpb24gU2NvcmVzIGluIHVyYmFuIGNvbnRleHRzICh0aGF0IHBvaW50IGlzIG1hcmtlZCBieSBhIHRyaWFuZ2xlIGluIHRoZSBwbG90IGJlbG93IHRvIGRlbm90ZSB0aGlzKS4gDQoNCjxicj4NCg0KDQpgYGB7ciBlc3RpbWF0ZS1wbG90LWZzLWluZGljZXN9DQoNCmNvbl9lc3QgPC0gZnVuY3Rpb24odGJsLCB5LCB4LCB6KXsNCiAgDQogIHkgPC0gZW5xdW8oeSkNCiAgeCA8LSBlbnF1byh4KQ0KICB6IDwtIGVucXVvKHopDQogIA0KICBtb2RlbF9mb3JtdWxhIDwtIGZvcm11bGEocGFzdGUwKHF1b19uYW1lKHkpLCAifiIsIHF1b19uYW1lKHgpKSkNCiAgDQogIGxtKG1vZGVsX2Zvcm11bGEsIGRhdGEgPSB0YmwpICU+JSANCiAgICB0aWR5KGNvbmYuaW50ID0gVFJVRSkgJT4lIA0KICAgIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSANCiAgICBtdXRhdGUobW9kZWwgPSBwYXN0ZTAocXVvX25hbWUoeSksICJfIiwgcXVvX25hbWUoeikpKQ0KfQ0KDQpyYmluZCgNCnN1cnZleSAlPiUgDQogIGZpbHRlcihydXJhbCA9PSAxKSAlPiUgDQogIGNvbl9lc3QoaGhmY3NfaW52LCBzaG9ja3NfY29uZmxpY3QsIHJ1cmFsKSwgDQpzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocnVyYWwgPT0gMSkgJT4lIA0KICBjb25fZXN0KGZpZXNfcmF3X3JhbmdlLCBzaG9ja3NfY29uZmxpY3QsIHJ1cmFsKSwNCnN1cnZleSAlPiUgIA0KICBmaWx0ZXIocnVyYWwgPT0gMSkgJT4lIA0KICBjb25fZXN0KGNzaV93ZWlnaHRlZCwgc2hvY2tzX2NvbmZsaWN0LCBydXJhbCksDQpzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocnVyYWwgPT0gMCkgJT4lIA0KICBjb25fZXN0KGhoZmNzX2ludiwgc2hvY2tzX2NvbmZsaWN0LCB1cmJhbiksIA0Kc3VydmV5ICU+JSANCiAgZmlsdGVyKHJ1cmFsID09IDApICU+JSANCiAgY29uX2VzdChmaWVzX3Jhd19yYW5nZSwgc2hvY2tzX2NvbmZsaWN0LCB1cmJhbiksDQpzdXJ2ZXkgJT4lICANCiAgZmlsdGVyKHJ1cmFsID09IDApICU+JSANCiAgY29uX2VzdChjc2lfd2VpZ2h0ZWQsIHNob2Nrc19jb25mbGljdCwgdXJiYW4pDQopICU+JSANCiAgbXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHAudmFsdWUgPD0gMC4wNSwgMSwgMCksDQogICAgICAgICBtb2RlbCA9IHJlY29kZShtb2RlbCwgImhoZmNzX2ludl9ydXJhbCIgPSAiRkNTX3J1cmFsIiwgImhoZmNzX2ludl91cmJhbiIgPSAiRkNTX3VyYmFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVzX3Jhd19yYW5nZV9ydXJhbCIgPSAiRklFU19ydXJhbCIsICJmaWVzX3Jhd19yYW5nZV91cmJhbiIgPSAiRklFU191cmJhbiIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICJjc2lfd2VpZ2h0ZWRfcnVyYWwiID0gIkNTSV9ydXJhbCIsICJjc2lfd2VpZ2h0ZWRfdXJiYW4iID0gIkNTSV91cmJhbiIpLA0KICAgICAgICAgbW9kZWwgPSBmY3RfcmVvcmRlcihtb2RlbCwgZXN0aW1hdGUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gbW9kZWwsIGNvbG91ciA9IGVzdGltYXRlKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHBjaCA9IGZjdF9yZXYoZmFjdG9yKHNpZ25pZmljYW50KSkpLCBzaXplID0gMikgKyANCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMikgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gInR1cmJvIiwgZ3VpZGUgPSAibm9uZSIpICsgDQogIGxhYnMoeCA9ICJFc3RpbWF0ZSIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiRWZmZWN0IG9mIGNvbmZsaWN0IG9uIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNwbGl0IGJ5IHJ1cmFsL3VyYmFuIGNvbnRleHRzIiwNCiAgICAgICBwY2ggPSAiU2lnbmlmaWNhbnQiKSANCiAgDQpgYGANCg0KPGJyPg0KDQpBcHByb3hpbWF0ZWx5IDYlIG9mIGFsbCB0aGUgaG91c2Vob2xkcyBzdXJ2ZXllZCBieSBGQU8tV0ZQIHdlcmUgZGlyZWN0bHkgYWZmZWN0ZWQgYnkgY29uZmxpY3QsIHZpb2xlbmNlIGFuZCBpbnNlY3VyaXR5LiBIb3dldmVyLCB0aGlzIGRvZXMgZGlzY291bnQgaG91c2Vob2xkcyB0aGF0IGhhdmUgYmVlbiBhZmZlY3RlZCBieSB0aGUgc2Vjb25kYXJ5IGltcGFjdHMgb2YgY29uZmxpY3QsIHN1Y2ggYXMgbG9zcyBvZiBhY2Nlc3MgdG8gbWFya2V0cyBhbmQgaW5jcmVhc2VkIGZvb2QgcHJpY2VzLiANCg0KV2hpbHN0IHRoZXJlIGlzIG5vIHNldCB0aHJlc2hvbGQgd2hlcmVieSBvbmUgY2FuIHN0YXRlIHRoYXQgZXZlcnlvbmUgaW4gYSBnaXZlbiBhcmVhIGhhcyBiZWVuIGFmZmVjdGVkIGJ5IGNvbmZsaWN0LCBpdCBpcyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGNvbmZsaWN0IGhhcyBiZWVuIHRoZSBtb3N0IHNldmVyZS4gSW4gdGhlIG5leHQgc2VjdGlvbiwgY29uZmxpY3Qgc2NvcmVzLCB0b2dldGhlciB3aXRoIHByZS1leGlzdGluZyB2dWxuZXJhYmlsaXR5IHdpbGwgYmUgdXNlZCB0byBwcmlvcml0aXNlIGJldHdlZW4gdG93bnNoaXBzLg0KDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBQcmlvcml0aXNhdGlvbiBvZiB0b3duc2hpcHMgYnkgZXhwb3N1cmUgdG8gY29uZmxpY3QgYW5kIHByZS1leGlzdGluZyB2dWxuZXJhYmlsaXR5DQoNCk15YW5tYXIgaGFkIHRoZSBtb3N0IGNvbmZsaWN0IGV2ZW50cyBvdXQgb2YgYW55IGNvdW50cnkgaW4gMjAyMSwgZXhjZWVkaW5nIFN5cmlhLCBZZW1lbiBhbmQgQWZnaGFuaXN0YW4uIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWNvbmZsaWN0LXllYXJzLWNvbXBhcmV9DQphY2xlZCAlPiUgDQogIGZpbHRlcihzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgbXV0YXRlKHllYXJzID0gaWZlbHNlKHllYXIgJW91dCUgYygyMDIxLCAyMDIyKSwgIjIwMTAtMjAyMCIsIHllYXIpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcnMpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfZXZlbnRzID0gbigpKSAlPiUgDQogIG11dGF0ZShhdmdfZXZlbnRzX3Blcl95ZWFyID0gaWZlbHNlKHllYXJzICVpbiUgYygyMDIxLCAyMDIyKSwgdG90YWxfZXZlbnRzLCB0b3RhbF9ldmVudHMgLyAxMSkpICU+JSANCiAgbGVmdF9qb2luKGFjbGVkICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZSh5ZWFycyA9IGlmZWxzZSh5ZWFyICVvdXQlIGMoMjAyMSwgMjAyMiksICIyMDEwLTIwMjAiLCB5ZWFyKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KHllYXJzKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRvdGFsX2ZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGF2Z19mYXRhbGl0aWVzX3Blcl95ZWFyID0gaWZlbHNlKHllYXJzICVpbiUgYygyMDIxLCAyMDIyKSwgdG90YWxfZmF0YWxpdGllcywgdG90YWxfZmF0YWxpdGllcyAvIDExKSksIA0KICAgICAgICAgICAgYnkgPSAieWVhcnMiKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoYXZnX2V2ZW50c19wZXJfeWVhciwgYXZnX2ZhdGFsaXRpZXNfcGVyX3llYXIpLCB+cm91bmQoLngsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiSW5jcmVhc2UgaW4gY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGNvbXBhcmVkIHRvIHByZXZpb3VzIGRlY2FkZSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNjbGVkZGF0YS5jb20uIERhdGEgZm9yIDIwMjIgaXMgdW50aWwgMjAyMi0wNS0zMS4iLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+DQoNCkdpdmVuIHRoZSBtb3JlIHRoYW4gZm91cnRlZW5mb2xkIGluY3JlYXNlIGluIGNvbmZsaWN0IGV2ZW50cyBhbmQgdGhpcnRlZW5mb2xkIGluY3JlYXNlIGluIGNvbmZsaWN0IGZhdGFsaXRpZXMgaW4gTXlhbm1hciBpbiAyMDIxIChjb21wYXJlZCB0byB0aGUgYXZlcmFnZSBmb3IgdGhlIHByZWNlZGluZyAxMCB5ZWFycyksIGNvbmZsaWN0IHdpbGwgYmUgbWFqb3IgcGFydCBvZiBkZXRlcm1pbmluZyB3aGljaCBhcmVhcyBoYXZlIHRoZSBncmVhdGVzdCBodW1hbml0YXJpYW4gbmVlZHMuIEhvd2V2ZXIsIHNjb3JpbmcgdG93bnNoaXBzIGJhc2VkIG9ubHkgb24gb25lIHZhcmlhYmxlIHdvdWxkIGxlYWQgdG8gYSB2ZXJ5IHVuaS1kaW1lbnNpb25hbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjcmlzaXMuIA0KDQpTaW1pbGFyIHRvIGhvdyBhIGJlbmVmaWNpYXJ5IHByb2ZpbGUgd2FzIGVzdGFibGlzaGVkIGluIG9yZGVyIHRvIGluZm9ybSBiZW5lZmljaWFyeSBzZWxlY3Rpb24sIHRoaXMgc2VjdGlvbiwgd2lsbCBmb2N1cyBvbiB3aGF0IHZhcmlhYmxlcyBzaG91bGQgYmUgY29uc2lkZXJlZCB3aGVuIHByaW9yaXRpc2luZyBhbW9uZ3N0IHRoZSB2YXJpb3VzIGdlb2dyYXBoaWMgYXJlYXMgaW4gTXlhbm1hciBhbmQgaG93IHRoZSByZXN1bHRzIG9mIHN1Y2ggYSBwcmlvcml0aXNhdGlvbiBzaG91bGQgYmUgYXBwbGllZC4gQXMgd2l0aCBlYXJsaWVyIHNlY3Rpb25zLCB0aGUgYW5hbHlzaXMgaGVyZSBpcyBtZWFudCB0byBkZXNjcmliZSBhbmQgaW5mb3JtIHByb2dyYW1tYXRpYyBhbmQgb3BlcmF0aW9uYWwgZGVjaXNpb24gbWFraW5nLCBhcyBvcHBvc2VkIHRvIGRpY3RhdGluZyBpdCwgYXMgZWFjaCBwYXJ0bmVyIHdpbGwgaGF2ZSB0aGVpciBvd24gY29uc2lkZXJhdGlvbnMgYW5kIGxpbWl0YXRpb25zLiANCg0KRm9yIGEgbW9yZSBjb21wcmVoZW5zaXZlIHJldmlldyBvZiBjb25mbGljdCBpbiBNeWFubWFyLCBwbGVhc2UgcmVmZXIgdG8gdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlcidzIHJlcG9ydCBbVW5kZXJzdGFuZGluZyBDb25mbGljdCBEeW5hbWljcyBpbiBNeWFubWFyIHRocm91Z2ggQ29uZmxpY3QgYW5kIEluY2lkZW50IERhdGE6IEEgRm9vZCBTZWN1cml0eSBQZXJzcGVjdGl2ZV0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vZXhwbG9yYXRvcnktZGF0YS1hbmFseXNpcy1hY2xlZC1mc2MvKS4gQW5kIGZvciBhIG1vcmUgY29tcHJlaGVuc2l2ZSByZXZpZXcgb2YgbXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsdHkgaW4gTXlhbm1hciwgcGxlYXNlIHJlZmVyIHRvIE1JTVUtSEFSUCdzIFtWdWxuZXJhYmlsaXR5IFN0dWR5XShodHRwOi8vdGhlbWltdS5pbmZvL3NpdGVzL3RoZW1pbXUuaW5mby9maWxlcy9kb2N1bWVudHMvUmVwb3J0X1Z1bG5lcmFiaWxpdHlfaW5fTXlhbm1hcl9IQVJQLU1JTVVfSnVuMjAxOF9FTkdfUHJpbnRfdmVyc2lvbi5wZGYpLiAgDQoNCjxicj48YnI+DQoNCiMjIyAyLjEgQ29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IHN0YXRlL3JlZ2lvbg0KDQpgYGB7ciBjb25maWN0LXN0YXRlLWJhcnBsb3R9DQpjb25mbGljdF9zY29yZSAlPiUgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCBwcm90ZXN0c19hbmRfcmlvdHMsIA0KICAgICAgICAgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGJhdHRsZXM6dmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpLCBuYW1lc190byA9ICJldmVudF90eXBlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBsZWZ0X2pvaW4oZnNfcGluICU+JSBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IHN1bSh2YWx1ZSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIC10b3RhbF9ldmVudHMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHN0YXRlLCB5ID0gdmFsdWUsIGZpbGwgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCB2anVzdCA9IDAuNywgaGp1c3QgPSAwLjcpLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDb25mbGljdCBldmVudHMiLA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBieSBzdGF0ZSAoSmFuIDIwMjEgLSBNYXkgMjAyMikiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikNCg0KI2dnc2F2ZSgiZXZlbnRfdHlwZV9zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj4NCg0KU3RhcnRpbmcgYXQgdGhlIHN0YXRlL3JlZ2lvbiBsZXZlbCwgU2FnYWluZyBzYXcgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhcyB3ZWxsIGFzIGNvbmZsaWN0IGFzIHdlbGwgYXMgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGluIDIwMTIuIEl0IGV4cGVyaWVuY2VkIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBhcyBtYW55IGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyB0aGFuIHRoZSBuZXh0LWhpZ2hlc3Qgc3RhdGUvcmVnaW9uIC0tIE1hZ3dheS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IHNoaWZ0IGluIHRoZSBwYXR0ZXJuIG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHdoaWNoIGhhcyB0cmFkaXRpb25hbGx5IHJldm9sdmVkIGFyb3VuZCBLYWNoaW4sIFJha2hpbmUgYW5kIFNoYW4uIA0KDQpLYXlhaCwgQ2hpbiBhbmQgU2FnYWluZyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGZhdGFsaXRpZXMgcGVyIGNhcGl0YSBpbiAyMDIxLiANCg0KPGJyPg0KDQpgYGB7ciBjb25mbGljdC1mYXRhbGl0aWVzLWJhcnBsb3R9DQoNCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgZmF0YWxpdGllcykgJT4lIA0KICBsZWZ0X2pvaW4oZnNfcGluICU+JSBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgcG9wdWxhdGlvbl8yMDIxX3Byb2opLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgIHBvcCA9IHN1bShwb3B1bGF0aW9uXzIwMjFfcHJvaikpICU+JSANCiAgbXV0YXRlKGZhdGFsaXRpZXNfcGMgPSBmYXRhbGl0aWVzIC8gcG9wKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCAtZmF0YWxpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBmYXRhbGl0aWVzLCBmaWxsID0gZmF0YWxpdGllc19wYykpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIHZqdXN0ID0gMC43LCBoanVzdCA9IDAuNyksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyIsIA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGZhdGFsaXRpZXMgYnkgc3RhdGUgKEphbiAyMDIxIC0gTWF5IDIwMjIpIiwNCiAgICAgICBzdWJ0aXRsZSA9ImFuZCBmYXRhbGl0aWVzIHBlciBjYXBpdGEiLCANCiAgICAgICBmaWxsID0gImZhdGFsaXRpZXNcbnBlciBjYXBpdGEiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikNCg0KIyBnZ3NhdmUoImZhdGFsaXRpZXNfc3RhdGUucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDgsIHVuaXRzID0gImluIikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDIuMiBDb25mbGljdCBzY29yZSBieSB0b3duc2hpcA0KDQpBcyBjYW4gYmUgc2VlbSBmcm9tIHRoZSBzdGF0ZS9yZWdpb24gYmFycGxvdHMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoZSBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGlzIG5vdCBldmVuLCBhbmQgaXMgc2tld2VkIHRvd2FyZHMgYSBmZXcgc3RhdGVzL3JlZ2lvbnMuIFRoaXMgaXMgYWxzbyBldmlkZW50IGF0IHRvd25zaGlwIGxldmVsLiBJbiB0aGUgc2NhdHRlciBwbG90IGJlbG93LCB0aGUgYXZlcmFnZXMgb2YgdGhlIG51bWJlciBvZiBjb25mbGljdCBldmVudHMgYW5kIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhdCB0aGUgdG93bnNoaXAgbGV2ZWwgaGF2ZSBiZWVuIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lcywgZGl2aWRpbmcgdGhlIHBsb3QgaW50byBmb3VyIHF1YWRyYW50cy4gDQoNClRvIGJldHRlciBkaXNjcmltaW5hdGUgYW1vbmdzdCB0aGUgbnVtZXJvdXMgdG93bnNoaXBzLCBhIGNvbmZsaWN0IHNjb3JlIGhhcyBiZWVuIGRldmVsb3BlZC4gQSByZXF1aXNpdGUgZm9yIGFueSBwcmlvcml0aXNhdGlvbiBzY29yZSBvciBpbmRleCBmb3IgY29uZmxpY3Qgc2hvdWxkIGJlIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoLCBmaXJzdCBhbmQgZm9yZW1vc3QsIHRoZSB0b3duc2hpcHMgaW4gdGhlIHVwcGVyIHJpZ2h0IHF1YWRyYW50IG9mIHRoZSBwbG90LCB3aGljaCBoYXZlIHRoZSBoZWF2aWVzdCBjb25jZW50cmF0aW9ucyBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMuIFRoZXNlIGFyZWFzIGFyZSBhbHNvIHdoZXJlLCBhcyB3ZSBoYXZlIGVzdGFibGlzaGVkIGluIHRoZSBzZWN0aW9uIG9uIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiwgd2hlcmUgdGhlIGhpZ2hlc3QgY29uY2VudHJhdGlvbnMgb2YgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgd2lsbCBiZSBmb3VuZC4gRm9yIHJlZmVyZW5jZSwgNTggdG93bnNoaXBzIGhhdmUgYm90aCBhYm92ZS1hdmVyYWdlIG51bWJlcnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzICh1cHBlci1yaWdodCBxdWFkcmFudCkgYW5kIDE5NiB0b3duc2hpcHMgaGF2ZSBib3RoIGJlbG93LWF2ZXJhZ2UgbnVtYmVycyBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgKGJvdHRvbS1sZWZ0IHF1YWRyYW50KS4gDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LWNvbmZsaWN0LXNjYXR0ZXJwbG90fQ0KY29uZmxpY3Rfc2NhdHRlciA8LSBjb25mbGljdF9zY29yZSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgbGVmdF9qb2luKGZzX3BpbiAlPiUgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcGFydG5lcnNfMjAyMSwgYWRtaW4zX3Bjb2RlLCBwb3B1bGF0aW9uX2RlbnNpdHkpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF9zY29yZSA9IHJvdW5kKGNvbmZsaWN0X3Njb3JlLCBkaWdpdHMgPSAzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBmYXRhbGl0aWVzLCB4ID0gdG90YWxfZXZlbnRzLCBjb2xvdXIgPSBjb25mbGljdF9zY29yZSwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mbGljdF9zY29yZTogIiwgY29uZmxpY3Rfc2NvcmUsICIsIiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzOiAiLCB0b3RhbF9ldmVudHMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnNfMjAyMTogIiwgcGFydG5lcnNfMjAyMSkpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBmYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjg1KSArDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGJyZWFrcyA9IGMoMCwgMSwgMTAsIDMwLCAxMDAsIDMwMCwgMTAwMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVhbihmYXRhbGl0aWVzKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKHRvdGFsX2V2ZW50cykpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBsYWJzKHggPSAiQ29uZmxpY3QgZXZlbnRzIiwgDQogICAgICAgeSA9ICJGYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgdG93bnNoaXAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNZWFucyBvZiBib3RoIGF4ZXMgYXJlIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lIiwNCiAgICAgICBjb2xvdXIgPSAiY29uZmxpY3RcbnNjb3JlIiwgDQogICAgICAgc2l6ZSA9ICJmYXRhbGl0aWVzIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIpIA0KDQpnZ3Bsb3RseShjb25mbGljdF9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCkgJT4lIA0KICAjIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSB0b3duc2hpcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IG1lYW5zIG1hcmtlZCBieSByZWQgbGluZXM7IGZhdGFsaXRpZXMgbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCiMgZ2dzYXZlKCJ0c3Bfc2NhdHRlcl9jb25mbGljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KDQpgYGANCg0KPGJyPg0KDQpBdCBpdHMgbW9zdCBiYXNpYywgdGhlIGNvbmZsaWN0IHNjb3JlIGlzIGp1c3QgdGhlIGF2ZXJhZ2Ugb2YgYmF0dGxlcywgZXhwbG9zaW9ucywgcmVtb3RlIHZpb2xlbmNlLCB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucywgc3RyYXRlZ2ljIGRldmVsb3BtZW50cywgbm9uLXBlYWNlZnVsIHByb3Rlc3RzIGFuZCByaW90cywgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGFuZCBJRFBzIChyZWZlciB0byBzZWN0aW9uIDQuNSBmb3IgbW9yZSBkZXRhaWxzKS4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgRlNDJ3MgcmVwb3J0IFtVbmRlcnN0YW5kaW5nIENvbmZsaWN0IER5bmFtaWNzIGluIE15YW5tYXIgdGhyb3VnaCBDb25mbGljdCBhbmQgSW5jaWRlbnQgRGF0YTogQSBGb29kIFNlY3VyaXR5IFBlcnNwZWN0aXZlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy8pLiBUaGlzIHNjb3JlIHdpbGwgYmUgbm93IGJlIHVzZWQgYXMgYSBzaG9ydGhhbmQgZm9yIGNvbmZsaWN0IGluY2lkZW5jZSBpbiBNeWFubWFyIGdvaW5nIGZvcndhcmQuIA0KDQo8YnI+PGJyPg0KDQojIyMgMi4zIENvbXBhcmlzb24gd2l0aCBtdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkNCg0KQ29uZmxpY3QsIGluIHNwaXRlIG9mIGl0cyBvdXQtc2l6ZWQgcm9sZSBpbiB0aGUgY3Jpc2lzIGluIE15YW5tYXIsIGNhbm5vdCBzZXJ2ZSBhcyB0aGUgb25seSBkZXRlcm1pbmFudCBvZiBnZW9ncmFwaGljIHByaW9yaXRpc2F0aW9uLiBJbiBvcmRlciB0byBjb25zaWRlciBvdGhlciBmYWN0b3JzLCB0aGlzIGRvY3VtZW50IHdpbGwgbWFrZSB1c2Ugb2YgdGhlIE1JTVUtSEFSUCBWdWxuZXJhYmlsaXR5IEluZGV4LCB3aGljaCBpcyBjb21wcmlzZWQgb2YgOCBpbmRpY2F0b3JzLCBzZWxlY3RlZCBmb3IgdGhlaXIgYWJpbGl0eSB0byBwcmVkaWN0IHRoZSByZXN0IG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIDIwMTUgQ2Vuc3VzIGRhdGFzZXQuIFNldmVyYWwgb2YgdGhlc2UgdmFyaWFibGVzIHdlcmUgYWxzbyBjb2xsZWN0ZWQgYXQgZGlzdHJpY3QtbGV2ZWwgYW5kIHdlcmUgdXNlZCB0byBjcmVhdGUgYW4gdXBkYXRlZCAyMDE5IFZ1bG5lcmFiaWxpdHkgaW5kZXguIA0KDQpUaGUgc3BlY2lmaWMgaW5kaWNhdG9ycyBjaG9zZW4gd2VyZTogDQoNCiogJSBvZiBwb3B1bGF0aW9uIHdpdGhvdXQgZm9ybWFsIGlkZW50aWZpY2F0aW9uIGRvY3VtZW50cw0KKiAlIG9mIHBvcHVsYXRpb24gd2l0aG91dCBhIG1pZGRsZSBzY2hvb2wgZWR1Y2F0aW9uDQoqICUgb2YgZmVtYWxlcyB3aG8gd2VyZSBpbGxpdGVyYXRlDQoqICUgb2YgaG91c2Vob2xkcyB3aXRoIGJhbWJvbyBvciB0aGF0Y2hlZCByb29mcw0KKiAlIG9mIGhvdXNlaG9sZHMgd2l0aCBzYWZlIHNhbml0YXRpb24NCiogJSBvZiBob3VzZWhvbGRzIHdpdGggYWNjZXNzIHRvIGVsZWN0cmljaXR5DQoqICUgb2Ygd29ya2VycyB3aG8gYXJlIHVucGFpZCBmYW1pbHkgd29ya2Vycw0KKiBUaGUgY2hpbGQgZGVwZW5kZW5jeSByYXRpbw0KKiBUaGUgY29uZmxpY3QgaW5kZXggKHJlZmxlY3RpbmcgYmF0dGxlcywgZmF0YWxpdGllcywgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgYW5kIGRpc3BsYWNlbWVudCkNCg0KVGhlc2UgaW5kaWNhdG9ycyB3ZXJlIGNvbWJpbmVkIHRvIGNvbnN0cnVjdCBhIHRvd25zaGlwLWxldmVsIHZ1bG5lcmFiaWxpdHkgaW5kZXguIE9mIHRoZSBpbmRpY2F0b3JzIGFib3ZlLCBvbmx5IHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwb3B1bGF0aW9uIHdpdGhvdXQgYSBtaWRkbGUtc2Nob29sIGVkdWNhdGlvbiBhbmQgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiB3aXRob3V0IGZvcm1hbCBpZGVudGlmaWNhdGlvbiBkb2N1bWVudHMgd2VyZSBub3QgY29sbGVjdGVkIGluIHRoZSAyMDE5IEludGVyLUNlbnNhbCBzdXJ2ZXkuIA0KDQpGb3IgdGhlIHJlbWFpbmluZyBpbmRpY2F0b3JzLCB0aGV5IHdlcmUgYm9vdHN0cmFwcGVkIHVzaW5nIHRoZWlyIDIwMTUgdG93bnNoaXAgdmFsdWVzIGFuZCB0aGUgMjAxOSBkaXN0cmljdC1sZXZlbCBkYXRhLiBHb2luZyBmb3J3YXJkLCB0aGUgZmlyc3Qgc2V2ZW4gY29tcG9uZW50cyBvZiB0aGUgaW5kZXggd2lsbCBiZSBleHRyYWN0ZWQgYW5kIHRyZWF0ZWQgc2VwYXJhdGVseSBhcyBhIHNob3J0aGFuZCBmb3IgcHJlLWV4aXN0aW5nIG11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eSBpbiBNeWFubWFyLiANCg0KSG93ZXZlciwgdGhlIGVpZ2h0aCBjb21wb25lbnQgb2YgdGhlIHZ1bG5lcmFiaWxpdHkgaW5kZXgsIHRoZSBjb25mbGljdCBpbmRleCwgZmlyc3QgY29uc3RydWN0ZWQgaW4gMjAxNSBmcm9tIEFDTEVEIGRhdGEsIGNhbiBhbmQgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIG1vcmUgcmVjZW50IGRhdGEgLS0gdGhpcyB3YXMgZG9uZSBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gVGhpcyBuZXh0IGZldyBzZWN0aW9ucyB3aWxsIGV4YW1pbmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHVuZGVyZGV2ZWxvcG1lbnQgYW5kIHRoZSB1cGRhdGVkIDIwMjEgY29uZmxpY3Qgc2NvcmUgYW5kIHRoZSByZXN1bHRpbmcgaW1wbGljYXRpb25zIG9uIGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24gZm9yIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIuIA0KDQpGaXJzdGx5LCBmcm9tIHRoZSBzY2F0dGVyIHBsb3QgYmVsb3csIHVuZGVyZGV2ZWxvcG1lbnQgYW5kIHByZS1leGlzdGluZyB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBhcmUgbm90IGdvb2QgcHJlZGljdG9ycyBvZiBlYWNoIG90aGVyLiBUaGUgcG9pbnRzIGluIHRoZSBwbG90IGJlbG93LCBlYWNoIHJlcHJlc2VudGluZyBhIHRvd25zaGlwLCBzcGxpdCBsYXJnZWx5IGFjcm9zcyB0d28gYXJjcyAtLSB3aXRoIHRvd25zaGlwcyB3aXRoIGhpZ2ggY29uZmxpY3Qgc2NvcmVzIGxhcmdlbHkgZmFsbGluZyBhcm91bmQgdGhlIG1lZGlhbiBmb3IgbXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCB0b3duc2hpcHMgd2l0aCB2ZXJ5IGhpZ2ggbXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IHRlbmRpbmcgdG8gaGF2ZSBsb3dlciBjb25mbGljdCBzY29yZXMuIA0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS1tZHAtc2NhdHRlcn0NCm1kcF9zY2F0dGVyIDwtIGZzX3BpbiAlPiUgIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gYmF0dGxlcyArIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlICsgcHJvdGVzdHNfYW5kX3Jpb3RzICsgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyArDQogICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSAlPiUNCiAgZmlsdGVyKGNvbmZsaWN0X3Njb3JlICE9IDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtZHBfYWRqdXN0LCB5ID0gY29uZmxpY3Rfc2NvcmUsIGNvbG91ciA9IGNvbmZsaWN0X3Njb3JlLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50czogIiwgdG90YWxfZXZlbnRzLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmF0YWxpdGllczogIiwgZmF0YWxpdGllcywgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0X3Njb3JlOiAiLCByb3VuZChjb25mbGljdF9zY29yZSwgZGlnaXRzID0gMyksICIsIiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAibWRfdnVsbmVyYWJpbGl0eTogIiwgcm91bmQobWRwX2FkanVzdCwgZGlnaXRzID0gMyksICIsIiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnNfMjAyMTogIiwgcGFydG5lcnNfMjAyMSkpKSArIA0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVkaWFuKGNvbmZsaWN0X3Njb3JlKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuKG1kcF9hZGp1c3QpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgYWxwaGEgPSAuNykgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgbGFicyh4ID0gIk11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eSAoMjAxNSkiLCB5ID0gIkNvbmZsaWN0IHNjb3JlICgyMDIxKSIsIGNvbG91ciA9ICJjb25mbGljdFxuc2NvcmUiLCANCiAgICAgICB0aXRsZSA9ICJNdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkgYW5kIGNvbmZsaWN0IGJ5IHRvd25zaGlwIiwgDQogICAgICAgc3VidGl0bGUgPSAiQXZlcmFnZXMgbWFya2VkIGJ5IHJlZCBsaW5lczsgcG9wdWxhdGlvbiBtYXJrZWQgYnkgc2l6ZSIpDQoNCmdncGxvdGx5KG1kcF9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gNTUwKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBieSB0b3duc2hpcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2VzIG1hcmtlZCBieSByZWQgbGluZXM7IHBvcHVsYXRpb24gbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCg0KDQoNCmBgYA0KDQo8YnI+DQoNClRoaXMgaXMgYSByZWZsZWN0aW9uIG9mIHRoZSBzaGlmdCBpbiBjb25mbGljdCBhd2F5IGZyb20gZnJvbnRpZXIgYXJlYXMgdG8gY2l0aWVzIGFuZCB0b3ducyB0aGF0IGhhdmUgbW9yZSBzdHJhdGVnaWMgdGFyZ2V0cy4gVGhlIGJyb2FkZXIgaW52b2x2ZW1lbnQgb2YgdGhlIEJhbWFyIG1ham9yaXR5IGluIHRoZSBjb25mbGljdCBoYXMgbGlrZWx5IGFsc28gY29udHJpYnV0ZWQgdG8gdGhpcyBzaGlmdCAtLSBwcmlvciB0byB0aGUgRmVicnVhcnkgMjAyMSBjb3VwLCB0aGUgY29uZmxpY3Qgd2FzIGxhcmdlbHkgYmV0d2VlbiBFdGhuaWMgQXJtZWQgT3JnYW5pc2F0aW9ucyBhbmQgdGhlIE15YW5tYXIgQXJtZWQgRm9yY2VzLiBIb3dldmVyLCBjb21iYXRhbnRzIGFyZSBub3cgc3ByZWFkIHRocm91Z2hvdXQgdGhlIHBvcHVsYXRpb25zLCBlc3BlY2lhbGx5IHdpdGggdGhlIHByb2xpZmVyYXRpb24gb2YgdGhlIFBlb3BsZSdzIERlZmVuY2UgRm9yY2VzLiANCg0KSXQgaGFzIGJlZW4gW29ic2VydmVkXShodHRwczovL3d3dy5pcnJhd2FkZHkuY29tL25ld3MvYnVybWEva2FjaGluLWluZGVwZW5kZW5jZS1hcm15LXBkZnMtYXR0YWNrLW15YW5tYXItanVudGEtYmFzZXMtaW4ta2FjaGluLXN0YXRlLmh0bWwpIHRoYXQgRXRobmljIEFybWVkIE9yZ2FuaXNhdGlvbnMsIHN1Y2ggYXMgdGhlIEthY2hpbiBJbmRlcGVuZGVuY2UgQXJteSwgYXJlIHdvcmtpbmcgY2xvc2VseSB3aXRoIHRoZSBQZW9wbGUncyBEZWZlbmNlIEZvcmNlcywgYW5kIGFyZSB0cmFpbmluZyBhbmQgYXJtaW5nIHRoZW0uIFRoaXMgaGFzIGNvbnRyaWJ1dGVkIHRvIHRoZSBmcm9udCBiZWluZyBtb3ZlZCBmdXJ0aGVyIGZvcndhcmQsIG91dHNpZGUgb2YgdGhlIGFyZWFzIHRoYXQgaGFkIGJlZW4gdHJhZGl0aW9uYWxseSBtb3N0IGFmZmVjdGVkIGJ5IGNvbmZsaWN0Lg0KDQo8YnI+PGJyPg0KDQojIyMgMi40IDIwMTUgdnVsbmVyYWJpbGl0eSBiYW5kcw0KDQpUaGlzIHNoaWZ0IGluIGNvbmZsaWN0IHBhdHRlcm5zIGNhbiBiZSBmdXJ0aGVyIGV4YW1pbmVkIGJ5IGNvbnNpZGVyaW5nIHRoZSB2dWxuZXJhYmlsaXR5IGJhbmRzIGRldmVsb3BlZCBieSBNSU1VLUhBUlAgYWxvbmdzaWRlIGl0cyB2dWxuZXJhYmlsaXR5IGluZGV4LiBJbiBhZGRpdGlvbiB0byBhbiBvdmVyYWxsIHZ1bG5lcmFiaWxpdHkgc2NvcmUgcGVyIHRvd25zaGlwLCA4IG1haW4gdHlwb2xvZ2llcyBvZiB2dWxuZXJhYmlsaXR5IHdlcmUgYWxzbyBjb25zdHJ1Y3RlZCB0byBpbGx1c3RyYXRlIHRoZSB3aWRlIHZhcmlhdGlvbiBvZiBjb250ZXh0cyBhbmQgbmVlZHMgaW4gdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgY291bnRyeSBhcyB3ZWxsIGFzIHRvIGdyb3VwIHRvZ2V0aGVyIHNpbWlsYXIgdG93bnNoaXBzIHNvIHRoYXQgdGhleSBtYXkgYmUgY29uc2lkZXJlZCBhcyBzZXBhcmF0ZSBwcm9ncmFtbWluZyBibG9jcy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBbTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgU3R1ZHldKGh0dHA6Ly90aGVtaW11LmluZm8vc2l0ZXMvdGhlbWltdS5pbmZvL2ZpbGVzL2RvY3VtZW50cy9SZXBvcnRfVnVsbmVyYWJpbGl0eV9pbl9NeWFubWFyX0hBUlAtTUlNVV9KdW4yMDE4X0VOR19QcmludF92ZXJzaW9uLnBkZikgZm9yIG1vcmUgZGV0YWlscy4gDQoNCkFjY29yZGluZyB0byBNSU1VLUhBUlAsIHRoZSByZXN1bHQgb2YgdGhpcyBncm91cGluZyBpcyBhICJsZW5zIGFsbG93aW5nIHRoZSBtb3N0IHZ1bG5lcmFibGUgdG8gYmUgY29uc2lkZXJlZCBtb3JlIG1ldGhvZGljYWxseSBpbiBwb2xpY3kgYW5kIHByb2dyYW1tZSBwbGFubmluZyIuIEJ5IHVzaW5nIHRoZXNlIDggdHlwb2xvZ2llcyBhcyBhIHJlZmVyZW5jZSwgaXQgaXMgcG9zc2libGUgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHBhdHRlcm4gb2YgY29uZmxpY3QgaGFzIGNoYW5nZWQgYmV0d2VlbiAyMDE1IGFuZCAyMDIxLiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1iYW5kcy1jb21wYXJpc29ufQ0KZnNfcGluICU+JSAgDQogIG11dGF0ZShvbGRfY29uZmxpY3Rfc2NvcmUgPSAxIC0gb2xkX2NvbmZsaWN0X3Njb3JlLCANCiAgICAgICAgIGNvdW50ID0gMSwgDQogICAgICAgICBhYm92ZV9jb25mbGljdF9tZWFuID0gaWZlbHNlKGNvbmZsaWN0X2VudiA+PSAwLjEyNjEwODQsIDEsIDApLA0KICAgICAgICAgYWJvdmVfY29uZmxpY3RfbWVhbl9vbGQgPSBpZmVsc2Uob2xkX2NvbmZsaWN0X2VudiA+PSAwLjAxNTA0ODcyLCAxLCAwKSkgJT4lDQogIGdyb3VwX2J5KGJhbmRfdGV4dCkgJT4lIA0KICBzdW1tYXJpc2UoYDIwMTlfdnVsbmVyYWJpbGl0eWAgPSBtZWFuKG1kcF9hZGp1c3QpLCAgICAgICAgIA0KICAgICAgICAgICAgb2xkX2NvbmZsaWN0X3Njb3JlID0gbWVhbihvbGRfY29uZmxpY3RfZW52KSwgDQogICAgICAgICAgICBjb25mbGljdF9zY29yZSA9IG1lYW4oY29uZmxpY3RfZW52KSwNCiAgICAgICAgICAgIHRzcF9jb3VudCA9IG4oKSwNCiAgICAgICAgICAgIHRzcF9hYm92ZV9tZWFuXzIwMTUgPSBzdW0oYWJvdmVfY29uZmxpY3RfbWVhbl9vbGQgPT0gMSksIA0KICAgICAgICAgICAgdHNwX2Fib3ZlX21lYW5fMjAyMSA9IHN1bShhYm92ZV9jb25mbGljdF9tZWFuID09IDEpKSAlPiUNCiAgbXV0YXRlKHBjX2Fib3ZlX21lYW5fMjAxNSA9IHJvdW5kKHRzcF9hYm92ZV9tZWFuXzIwMTUgLyB0c3BfY291bnQgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX2Fib3ZlX21lYW5fMjAyMSA9IHJvdW5kKHRzcF9hYm92ZV9tZWFuXzIwMjEgLyB0c3BfY291bnQgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHNlbGVjdCgtdHNwX2Fib3ZlX21lYW5fMjAxNSwgLXRzcF9hYm92ZV9tZWFuXzIwMjEpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY29uZmxpY3Rfc2NvcmUsIG9sZF9jb25mbGljdF9zY29yZSwgYDIwMTlfdnVsbmVyYWJpbGl0eWApLCB+IHJvdW5kKC54LCBkaWdpdHMgPSAzKSkgJT4lDQogIHJlbmFtZSh2dWxuZXJhYmlsaXR5X2JhbmQgPSBiYW5kX3RleHQsIA0KICAgICAgICAgYDIwMTVfc2NvcmVgID0gb2xkX2NvbmZsaWN0X3Njb3JlLCANCiAgICAgICAgIGAyMDIyX3Njb3JlYCA9IGNvbmZsaWN0X3Njb3JlLCANCiAgICAgICAgIGAlXz5hdmdfMjAxNWAgPSBwY19hYm92ZV9tZWFuXzIwMTUsIA0KICAgICAgICAgYCVfPmF2Z18yMDIxYCA9IHBjX2Fib3ZlX21lYW5fMjAyMSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkNoYW5nZXMgaW4gY29uZmxpY3QgcGF0dGVybnMgYmV0d2VlbiAyMDE1IGFuZCAyMDIxLCBieSB2dWxuZXJhYmlsdHkgYmFuZCIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZSgiRGF0YSBzb3VyY2U6IEFDTEVEIChhY2NsZWRkYXRhLmNvbSkgYW5kIE1JTVU7IGhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbW9yZSB2dWxuZXJhYmlsaXR5L2NvbmZsaWN0IiwgZ2VuZXJhbF90aXRsZSA9ICIiKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAyLCAiY29uZmxpY3Qgc2NvcmUiID0gMiwgInRvd25zaGlwcyBhYm92ZSBhdmcgY29uZmxpY3Qgc2NvcmUiID0gMykpDQoNCg0KDQpgYGANCg0KPGJyPg0KDQoNCkNvbmZsaWN0LCBvbmNlIG11Y2ggbW9yZSBjb25jZW50cmF0ZWQgaW4gdW5kZXJkZXZlbG9wZWQgZnJvbnRpZXIgYXJlYXMgaW4gdGhlIG9wZXJhdGlvbmFsIGFyZWFzIG9mIEV0aG5pYyBBcm1lZCBPcmdhbmlzYXRpb25zLCBpcyBub3cgbXVjaCBtb3JlIHByb25vdW5jZWQgaW4gYmFuZHMgMywgNiBhbmQgOCwgd2hpY2ggY29udGFpbiBtYWpvciBwb3B1bGF0aW9uIGNlbnRyZXMgYW5kIHNlY29uZGFyeSBjaXRpZXMgYW5kIHRvd25zLiBIdWJzIGluIGNvbmZsaWN0LWFmZmVjdGVkIGFyZWFzIGhhdmUgdGhlIGhpZ2hlc3QgYXZlcmFnZSAyMDIxIGNvbmZsaWN0IHNjb3Jlcy4gDQoNCkFsdGhvdWdoIGNvbmZsaWN0IGhhcyBwZXJzaXN0ZWQgb3IgZXZlbiBpbmNyZWFzZWQgaW4gbWFueSBvZiB0aGUgZnJvbnRpZXIgYW5kIHJlbW90ZSBhcmVhcyBzdWNoIGFzIExhdWtrYWluZywgTW9uZ3lhaSBhbmQgVGFuZ3lhbiAoYWxsIGZyb20gYmFuZCAxKSwgdGhlIHJlbGF0aXZlIHJhbmtpbmdzIG9mIHRoZXNlIGFyZWFzIGhhdmUgY2hhbmdlZCBhbmQgdGhleSBub3cgZm9ybSBhIG11Y2ggc21hbGxlciBzaGFyZSBvZiB1bmlvbndpZGUgY29uZmxpY3QgdGhhbiB0aGV5IGRpZCBpbiAyMDE1LiBUaGVzZSB0b3duc2hpcHMgdGVuZCB0byBoYXZlIG11Y2ggbG93ZXIgY29uZmxpY3Qgc2NvcmVzIGluIHNwaXRlIG9mIHRoZWlyIGhpZ2ggdnVsbmVyYWJpbGl0eSwgaW5kaWNhdGluZyB0aGF0IHdoaWxzdCB0aGV5IHJlbWFpbiBkZXZlbG9wbWVudCBwcmlvcml0aWVzLCB0aGV5IHNob3VsZCBmYWxsIG91dHNpZGUgdGhlIGNhc2Vsb2FkIGZvciBodW1hbml0YXJpYW4gYWN0aW9uLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5ldyB2dWxuZXJhYmlsaXR5IGJhbmRzIGJlIHJlLWRldmVsb3BlZCwgYXMgdGhleSBoYXZlIHByb3ZlZCB2ZXJ5IHVzZWZ1bDsgYnV0IHRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4gIA0KDQo8YnI+PGJyPg0KDQojIyMgMi41IENsdXN0ZXJpbmcgdG93bnNoaXBzDQoNCkluIHJlY29nbml0aW9uIG9mIHRoZSBkaWZmZXJlbnQgY29udGV4dHMgcHJlc2VudCBpbiBNeWFubWFyIChhbmQgdGhlIGNvbnNlcXVlbnQgbmVlZCBmb3IgZGlmZmVyZW50IHByb2dyYW1taW5nIG9wdGlvbnMpLCBhIHNpbXBsZSBLLW1lYW5zIGNsdXN0ZXJpbmcgd2FzIGNvbmR1Y3RlZCBvbiB0aGUgdG93bnNoaXBzIHRvIHNwbGl0IHRoZW0gaW50byBwcmlvcml0aXNhdGlvbiBncm91cHMgYmFzZWQgb24gdGhlaXIgMjAyMSBjb25mbGljdCBzY29yZSwgdGhlaXIgMjAxOSB2dWxuZXJhYmlsaXR5IHNjb3JlIGFuZCB0aGVpciBwb3B1bGF0aW9uIGRlbnNpdHkuIA0KDQpUaGlzIGNsdXN0ZXJpbmcgc2VwYXJhdGVzIGFsbCAzMzAgdG93bnNoaXBzIGludG8gZml2ZSBncm91cHMuIFRoZSBwbG90cyBiZWxvdyBzaG93IHRoZSBzcHJlYWQgb2YgdG93bnNoaXBzIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIGFjcm9zcyB0aGUgMjAyMSBjb25mbGljdCBzY29yZSwgMjAxOSB2dWxuZXJhYmlsaXR5IHNjb3JlIGFuZCBwb3B1bGF0aW9uIGRlbnNpdHkuIA0KDQo8YnI+DQoNCmBgYHtyIHBhdGNod29yay1jbHVzdGVyc30NCg0KcmV2ZXJzZWxvZ190cmFucyA8LSBmdW5jdGlvbihiYXNlID0gZXhwKDEpKSB7DQogICAgdHJhbnMgPC0gZnVuY3Rpb24oeCkgLWxvZyh4LCBiYXNlKQ0KICAgIGludiA8LSBmdW5jdGlvbih4KSBiYXNlXigteCkNCiAgICB0cmFuc19uZXcocGFzdGUwKCJyZXZlcnNlbG9nLSIsIGZvcm1hdChiYXNlKSksIHRyYW5zLCBpbnYsIA0KICAgICAgICAgICAgICBsb2dfYnJlYWtzKGJhc2UgPSBiYXNlKSwgDQogICAgICAgICAgICAgIGRvbWFpbiA9IGMoMWUtMTAwLCBJbmYpKQ0KfQ0KDQpmc19waW4gJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gbWRwX2FkanVzdCwgeSA9IGNvbmZsaWN0X3Njb3JlKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gY2x1c3Rlciwgc2l6ZSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgYWxwaGEgPSAuOCkgKyANCiAgZ3VpZGVzKGNvbG91ciA9ICJub25lIiwgc2l6ZSA9ICJub25lIikgKw0KICBsYWJzKHggPSAiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5ICgyMDE5KSIsIHkgPSAiQ29uZmxpY3Qgc2NvcmUgKDIwMjEpIikgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChvcHRpb24gPSAiY2l2aWRpcyIpICsgDQogIA0KZnNfcGluICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcG9wdWxhdGlvbl9kZW5zaXR5LCB5ID0gY29uZmxpY3Rfc2NvcmUpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBjbHVzdGVyLCBzaXplID0gcG9wdWxhdGlvbl8yMDIxX3Byb2opLCBhbHBoYSA9IC44KSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSByZXZlcnNlbG9nX3RyYW5zKDEwKSwgYnJlYWtzID0gYygwLCAxLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogIHNjYWxlX3NpemVfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyhzaXplID0gInBvcHVsYXRpb24iLCANCiAgICAgICB4ID0gIlBlcnNvbnMgcGVyIGttMiAocmV2ZXJzZWQpIiwgeSA9ICJDb25mbGljdCBzY29yZSAoMjAyMSkiKSArIA0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKyANCg0KICBwbG90X2xheW91dCh3aWR0aHMgPSAxKSArIA0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIHZ1bG5lcmFiaWxpdHksIHBvcHVsYXRpb24gZGVuc2l0eSBhbmQgY29uZmxpY3Qgc2NvcmUiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkhpZ2hlciB2dWxuZXJhYmlsdHkgYW5kIGNvbmZsaWN0IHNjb3JlcyBpbmRpY2F0ZSBtb3JlIHZ1bG5lcmFiaWxpdHkgYW5kIGNvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRCAoYWNsZWRkYXRhLmNvbSkgYW5kIE1JTVUiLCANCiAgICAgICAgICAgICAgICAgIHRoZW1lID0gdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSkNCg0KDQpgYGANCg0KPGJyPg0KDQpJdCBjYW4gYmUgc2VlbiB0aGF0IGdyb3VwcyBBMSBhbmQgQTIsIHdoaWNoIGhhdmUgdGhlIGhpZ2hlc3QgY29uZmxpY3Qgc2NvcmVzLCBhcmUgcXVpdGUgZGlzdGluY3QgZnJvbSBncm91cCBEICh3aGVyZSB0aGUgbWFqb3JpdHkgb2YgdGhlIGRldmVsb3BtZW50IGNhc2Vsb2FkIHJlc2lkZXMpLiBHcm91cCBDIGhhcyBuZWl0aGVyIGhpZ2ggdnVsbmVyYWJpbGl0eSBub3IgaGlnaCBjb25mbGljdCBpbmNpZGVuY2UuIEFuZCBncm91cCBCIGNvbnNpc3RzIG9mIHNvbGVseSB1cmJhbiBjZW50cmVzLiBUaGUgdGFibGUgYmVsb3cgcHJvdmlkZXMgbW9yZSBkZXRhaWwgb24gZWFjaCBvZiB0aGUgZ3JvdXBzLiANCg0KR3JvdXBzIEExIGFuZCBBMiBjb250YWluZWQgNjAlIG9mIGFsbCBjb25mbGljdCBldmVudHMgYW5kIDgzJSBvZiBhbGwgY29uZmxpY3QgZmF0YWxpdGllcyBpbiAyMDIxLiBHcm91cHMgQTEgYW5kIEEyIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBieSB0aGUgaW50ZW5zaXR5IG9mIGNvbmZsaWN0LCB3aXRoIEExIGJlaW5nIHdoZXJlIHRoZSBjb25jZW50cmF0aW9ucyBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYXJlIHRoZSBoZWF2aWVzdC4gDQoNCkFuIGludGVyYWN0aXZlIHZlcnNpb24gb2YgdGhlIHBsb3Qgb24gdGhlIGxlZnQgY2FuIGJlIGZvdW5kIGJlbG93LiANCg0KPGJyPiANCg0KYGBge3IgdGFibGUtZ3JvdXAtc3VtbWFyaWVzfQ0KZnNfcGluICU+JSAgIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gYmF0dGxlcyArIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlICsgcHJvdGVzdHNfYW5kX3Jpb3RzICsgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyArDQogICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSAlPiUNCiAgcmVwbGFjZV9uYShsaXN0KGZhdGFsaXRpZXMgPSAwKSkgJT4lIA0KICBncm91cF9ieShncm91cCA9IGNsdXN0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGNvbmZsaWN0X2V2ZW50cyA9IHN1bSh0b3RhbF9ldmVudHMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlfMjAxOSA9IG1lYW4obWRwX2FkanVzdCksDQogICAgICAgICAgICBhdmdfY29uZmxpY3Rfc2NvcmUgPSBtZWFuKGNvbmZsaWN0X3Njb3JlLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHBwbF9rbTIgPSByb3VuZChtZWFuKHBvcHVsYXRpb25fZGVuc2l0eSksIGRpZ2l0cyA9IDApLCANCiAgICAgICAgICAgIHBvcHVsYXRpb24gPSBzdW0ocG9wdWxhdGlvbl8yMDIxX3Byb2opLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG4oKSkgJT4lIA0KICBtdXRhdGUoYCVfdG90YWxfcG9wdWxhdGlvbmAgPSByb3VuZChwb3B1bGF0aW9uIC8gc3VtKHBvcHVsYXRpb24pICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX2ZhdGFsaXRpZXNgID0gcm91bmQoZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfY29uZmxpY3RfZXZlbnRzYCA9IHJvdW5kKGNvbmZsaWN0X2V2ZW50cyAvIHN1bShjb25mbGljdF9ldmVudHMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoZ3JvdXAsIGAlX2NvbmZsaWN0X2V2ZW50c2AsIGAlX2ZhdGFsaXRpZXNgLCBhdmdfY29uZmxpY3Rfc2NvcmUsIHZ1bG5lcmFiaWxpdHlfMjAxOSwgcHBsX2ttMiwgDQogICAgICAgICB0b3duc2hpcHMsIGAlX3RvdGFsX3BvcHVsYXRpb25gKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGF2Z19jb25mbGljdF9zY29yZSwgdnVsbmVyYWJpbGl0eV8yMDE5KSwgfnJvdW5kKC54LCBkaWdpdHMgPSAzKSkgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKGZvb3Rub3RlX2FzX2NodW5rID0gVFJVRSwgdGhyZWVwYXJ0dGFibGUgPSBUUlVFLCANCiAgICAgICAgICAgZ2VuZXJhbCA9ICJHcm91cHMgQTEgYW5kIEEyIGhhdmUgdGhlIGhpZ2hlc3QgY29uZmxpY3Qgc2NvcmVzIGFuZCBzaG91bGQgYmUgcHJpb3JpdGlzZWQgb3ZlciB0aGUgb3RoZXJzLiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIG1vcmUgdnVsbmVyYWJpbGl0eS9jb25mbGljdC4iLCBnZW5lcmFsX3RpdGxlID0gIiIpIA0KDQojICU+JQ0KIyAgc2F2ZV9rYWJsZShmaWxlID0gInN1bW1hcnlfc3RhdHNfZ3JvdXBzLnBuZyIsIHpvb20gPSAyKQ0KYGBgDQo8YnI+DQoNCkdyb3VwcyBBMSBhbmQgQTIgYm90aCBoYXZlIG1pZGRsaW5nIHZ1bG5lcmFiaWxpdHkgc2NvcmVzLCBidXQgaGF2ZSBtdWNoIGhpZ2hlciBhdmVyYWdlIGNvbmZsaWN0IHNjb3Jlcy4gR3JvdXAgQTEsIGluIHBhcnRpY3VsYXIsIGhhcyBhIHZlcnkgaGlnaCBjb25jZW50cmF0aW9uIG9mIGNvbmZsaWN0IGluY2lkZW50cyBhbmQgZmF0YWxpdGllcywgaW4gYWRkaXRpb24gdG8gaGF2aW5nIHRoZSBzZWNvbmQtaGlnaGVzdCB2dWxuZXJhYmlsaXR5IHNjb3JlcyBvZiB0aGUgZ3JvdXBzLiBUaGVzZSA2OSB0b3duc2hpcHMgKGNvbnRhaW5pbmcgYWJvdXQgMjQlIG9mIHRoZSBwb3B1bGF0aW9uKSBhcmUgY2xlYXIgcHJpb3JpdGllcyBmb3IgaHVtYW5pdGFyaWFuIGFjdGlvbi4gDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LWdyb3VwLXNjYXR0ZXJ9DQpncm91cF9zY2F0dGVyIDwtIGZzX3BpbiAlPiUgIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gYmF0dGxlcyArIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlICsgcHJvdGVzdHNfYW5kX3Jpb3RzICsgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyArDQogICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSAlPiUNCiAgZmlsdGVyKGNvbmZsaWN0X3Njb3JlICE9IDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtZHBfYWRqdXN0LCB5ID0gY29uZmxpY3Rfc2NvcmUsIGNvbG91ciA9IGNsdXN0ZXIsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsICIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cDogIiwgY2x1c3RlciwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0X3Njb3JlOiAiLCByb3VuZChjb25mbGljdF9zY29yZSwgZGlnaXRzID0gMyksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInZ1bF9zY29yZTogIiwgcm91bmQobWRwX2FkanVzdCwgZGlnaXRzID0gMyksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb246ICIsIHJvdW5kKHBvcHVsYXRpb25fMjAyMV9wcm9qLCBkaWdpdHMgPSAwKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnNfMjAyMTogIiwgcGFydG5lcnNfMjAyMSkpKSArIA0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVkaWFuKGNvbmZsaWN0X3Njb3JlKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuKG1kcF9hZGp1c3QpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgYWxwaGEgPSAuNykgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKyANCiAgbGFicyh4ID0gIk11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eSAoMjAxNSkiLCB5ID0gIkNvbmZsaWN0IHNjb3JlICgyMDIxKSIsIA0KICAgICAgIGNvbG91ciA9ICJncm91cCIsIHNpemUgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBieSB0b3duc2hpcCIsIA0KICAgICAgIHN1YnRpdGxlID0gIkF2ZXJhZ2VzIG1hcmtlZCBieSByZWQgbGluZXM7IHBvcHVsYXRpb24gbWFya2VkIGJ5IHNpemUiKQ0KDQpnZ3Bsb3RseShncm91cF9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gNTUwKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2VzIG1hcmtlZCBieSByZWQgbGluZXM7IHBvcHVsYXRpb24gbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDIuNiBMaW5raW5nIGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24gYW5kIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiANCg0KVXNpbmcgdGhlIGNsYXNzaWZpY2F0aW9ucyBmcm9tIHRoZSBkZWNpc2lvbiB0cmVlIGluIHNlY3Rpb24gMS4zLCB3ZSBjYW4gc2VlIHRoYXQgaW4gcnVyYWwgYXJlYXMsIHRoZSBoaWdoZXN0IHByb3BvcnRpb25zIG9mIHBlb3BsZSB3aG8gYXJlIGluIHRoZSBwcmlvcml0eSBncm91cCBhcmUgdGhvc2Ugd2hvIGhhdmUgYmVlbiBhZmZlY3RlZCBieSBjb25mbGljdCwgZm9sbG93ZWQgYnkgdGhvc2Ugd2hvIHdlcmUgYWZmZWN0ZWQgYnkgY29uZmxpY3QgYW5kIGhhdmUgbG9zdCB3b3JrIG9yIGVtcGxveW1lbnQgb3Bwb3J0dW5pdGllcy4gUnVyYWwgYXJlYXMgc2V2ZXJlbHktYWZmZWN0ZWQgYnkgY29uZmxpY3QgKHRoZSB0b3duc2hpcHMgaW4gZ3JvdXBzIEExIGFuZCBwYXJ0IG9mIEEyKSBhcmUgdGhlIGFyZWFzIGluIHdoaWNoIHdlIG1heSByZWFjaCBwb3B1bGF0aW9ucyB3aXRoIHRoZSBoaWdoZXN0IHByb3BvcnRpb25zIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXByaW9yaXR5LWhoZHMtbW9yZX0NCnN1cnZleSAlPiUgDQogIG11dGF0ZShwcmlvcml0eV9hZGogPSBwcmlvcml0eSAqIGNvbWJpbmVkX3d0KSAlPiUgDQogIGdyb3VwX2J5KHJ1cmFsLCBzaG9ja3NfY29uZmxpY3QsIHNob2Nrc19sb3N0d29yaykgJT4lIA0KICBzdW1tYXJpc2UocHJpb3JpdHkgPSBzdW0ocHJpb3JpdHlfYWRqKSwgDQogICAgICAgICAgICB0b3RhbF9wb3AgPSBzdW0oY29tYmluZWRfd3QpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHByaW9yaXR5IC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhydXJhbCwgc2hvY2tzX2NvbmZsaWN0LCBzaG9ja3NfbG9zdHdvcmspLCB+cmVjb2RlKC4sIGAwYCA9ICJubyIsIGAxYCA9ICJ5ZXMiKSkgJT4lIA0KICBmaWx0ZXIocGMgPiA0MCkgJT4lDQogIHNlbGVjdCgtcHJpb3JpdHksIC10b3RhbF9wb3ApICU+JSANCiAgcmVuYW1lKGAlX1ByaW9yaXR5YCA9IHBjLA0KICAgICAgICAgUnVyYWwgPSBydXJhbCwgDQogICAgICAgICBTaG9ja3NfQ29uZmxpY3QgPSBzaG9ja3NfY29uZmxpY3QsIA0KICAgICAgICAgU2hvY2tzX0xvc3RfV29yayA9IHNob2Nrc19sb3N0d29yaykgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIldoZXJlIGFyZSB0aGUgaGlnaGVzdCBwcm9wb3J0aW9ucyBvZiBwZXJzb25zIGluIHByaW9yaXR5IGdyb3Vwcz8iKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBjb2x1bW5fc3BlYygxOjQsIHdpZHRoID0gIjhlbSIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlczogQUNMRUQ7IGFjbGVkZGF0YS5jb20gYW5kIEZBTy1XRlAiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQoNCg0KPGJyPiANCg0KSW4gdXJiYW4gYXJlYXMgKGxhcmdlbHkgZ3JvdXAgQiwgYW5kIHBhcnQgb2YgQTIpLCBob3dldmVyLCBjb25mbGljdCBpbmNpZGVuY2UgaXMgbm90IGFzIGltcG9ydGFudCBvZiBhIGRldGVybWluaW5nIGZhY3RvciAtLSB0aGUgYmVzdCByZXN1bHRzIGNhbiBiZSBhY2hpZXZlZCBieSB0YXJnZXRpbmcgcGVvcGxlIHdobyBoYXZlIGxvc3Qgd29yayBvciBlbXBsb3ltZW50IG9wcG9ydHVuaXRpZXMsIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIG9yIG5vdCB0aGV5IGhhdmUgYmVlbiBhZmZlY3RlZCBieSBjb25mbGljdC4gIA0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgcG9wdWxhdGlvbiBncm91cHMgdGhhdCBoYXZlIHRoZSBsb3dlc3QgY29uY2VudHJhdGlvbnMgb2YgcHJpb3JpdHkgaG91c2Vob2xkcy4gIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXByaW9yaXR5LWhoZHMtbGVzc30NCnN1cnZleSAlPiUgDQogIG11dGF0ZShwcmlvcml0eV9hZGogPSBwcmlvcml0eSAqIGNvbWJpbmVkX3d0KSAlPiUgDQogIGdyb3VwX2J5KHJ1cmFsLCBzaG9ja3NfY29uZmxpY3QsIHNob2Nrc19sb3N0d29yaykgJT4lIA0KICBzdW1tYXJpc2UocHJpb3JpdHkgPSBzdW0ocHJpb3JpdHlfYWRqKSwgDQogICAgICAgICAgICB0b3RhbF9wb3AgPSBzdW0oY29tYmluZWRfd3QpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHByaW9yaXR5IC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhydXJhbCwgc2hvY2tzX2NvbmZsaWN0LCBzaG9ja3NfbG9zdHdvcmspLCB+cmVjb2RlKC4sIGAwYCA9ICJubyIsIGAxYCA9ICJ5ZXMiKSkgJT4lIA0KICBmaWx0ZXIocGMgPD0gNDApICU+JQ0KICBzZWxlY3QoLXByaW9yaXR5LCAtdG90YWxfcG9wKSAlPiUgDQogIHJlbmFtZShgJV9Qcmlvcml0eWAgPSBwYywNCiAgICAgICAgIFJ1cmFsID0gcnVyYWwsIA0KICAgICAgICAgU2hvY2tzX0NvbmZsaWN0ID0gc2hvY2tzX2NvbmZsaWN0LCANCiAgICAgICAgIFNob2Nrc19Mb3N0X1dvcmsgPSBzaG9ja3NfbG9zdHdvcmspICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJXaGljaCBhcmVhcyBoYXZlIGxlc3MgcGVvcGxlIGluIHRoZSBwcmlvcml0eSBncm91cD8iKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBjb2x1bW5fc3BlYygxOjQsIHdpZHRoID0gIjhlbSIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlczogQUNMRUQ7IGFjbGVkZGF0YS5jb20gYW5kIEZBTy1XRlAiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPg0KDQpBcyBtZW50aW9uZWQgZWFybGllciwgcnVyYWwgaG91c2Vob2xkcyB3ZXJlIGZvdW5kIHRvIGJlIGxlc3MgcmVzaWxpZW50IGFuZCBtb3JlIGFzc2V0LXBvb3IgaW4gSUZQUkkncyBob3VzZWhvbGQgd2VsZmFyZSBzdXJ2ZXkuIFRoZXNlIGZpbmRpbmdzIGFsaWduIHdlbGwgd2l0aCB0aGUgcHJvY2VzcyB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGhhcyBkZXZlbG9wZWQgaGVyZSB0byBpZGVudGlmeSBwcmlvcml0eSBob3VzZWhvbGRzICh3aGVyZSBydXJhbCBob3VzZWhvbGRzIGFyZSBzaWduaWZpY2FudGx5IG1vcmUgbGlrZWx5IHRvIGZhbGwgaW50byB0aGUgcHJpb3JpdHkgZ3JvdXApLiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgZnJ1aXRmdWwgdG8gZXhwbG9yZSB3aGV0aGVyIHRoaXMgYWxpZ25tZW50IGV4dGVuZHMgdG8gY29uZmxpY3QgYW5kIHNvbWUgb2YgdGhlIG90aGVyIGVudmlyb25tZW50YWwgYW5kIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIGVtcGxveWVkIGluIHRoaXMgZG9jdW1lbnQuIA0KDQpJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IHRvd25zaGlwcyB0aGVtc2VsdmVzIGFyZSBxdWl0ZSBsYXJnZSAtLSBvbiBhdmVyYWdlLCBlYWNoIGhhcyBhIHBvcHVsYXRpb24gb2YgYHIgc3VtbWFyaXNlKGZzX3BpbiwgbWVhbiA9IHJvdW5kKG1lYW4ocG9wdWxhdGlvbl8yMDIxX3Byb2opLCBkaWdpdHMgPSAwKSkgJT4lICBwdWxsKCkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMuIEluIGFyZWFzIHdoZXJlIHBhcnRuZXJzIGFyZSBub3QgeWV0IHByZXNlbnQsIHRoaXMgbWlnaHQgbmVjZXNzaXRhdGUgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgdG8gaGVscCBwYXJ0bmVycyBpZGVudGlmeSBzcGVjaWZpYyBhcmVhcyB3aGVyZSB0aGV5IGNvdWxkIGJlZ2luIHdvcmtpbmcuIA0KDQpJbiB0aGUgQUNMRUQgZGF0YXNldCwgb2YgdGhlIGByIGZpbHRlcihhY2xlZCwgeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgIG5yb3coKSAlPiUgIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGV2ZW50cyBpbiAyMDIxLCAzOCUgb2YgdGhlbSB3ZXJlIHJlY29yZGVkIHdpdGggc3BlY2lmaWMgdmlsbGFnZSBsb2NhdGlvbnMuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXZpbGxhZ2VzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUNCiAgbXV0YXRlKGhhc192aWxsYWdlID0gZmN0X3JlbGV2ZWwoaGFzX3ZpbGxhZ2UsIGMoInllcyIsICJubyIpKSkgJT4lIA0KICBncm91cF9ieShoYXNfdmlsbGFnZSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGludGVyYWN0aW9uKGFkbWluMywgbG9jYXRpb24pKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShgJV9ldmVudHNgID0gcm91bmQoZXZlbnRzIC8gc3VtKGV2ZW50cykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGAlX2ZhdGFsaXRpZXNgID0gcm91bmQoZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KG1lbnRpb25zX3ZpbGFnZSA9IGhhc192aWxsYWdlLCBldmVudHMsIGAlX2V2ZW50c2AsIGZhdGFsaXRpZXMsIGAlX2ZhdGFsaXRpZXNgLCBsb2NhdGlvbnMpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJDb25mbGljdCBldmVudHMgd2l0aCBhbmQgd2l0aG91dCB2aWxsYWdlcyIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIA0KICAgICAgICB0YWJsZS5hdHRyID0gInN0eWxlID0gJ3dpZHRoOjYwJTsnIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkJlbG93IGlzIGFuIGludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBvZiB0aGUgMSw5MTcgdmlsbGFnZXMgaWRlbnRpZmllZCBpbiB0aGUgQUNMRUQgZGF0YXNldCwgY29tcGxldGUgd2l0aCBjb29yZGluYXRlcy4gV2hpbGUgdGhpcyBsaXN0IGRvZXMgcHJvdmlkZSBhbiBleGNlbGxlbnQgc3RhcnQsIGJ5IHdvcmtpbmcgaW4gdGhlc2UgYXJlYXMsIHBhcnRuZXJzIHNob3VsZCBhbHNvIGVuZGVhdm91ciB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgbG9jYXRpb25zIG9mIHRoZSByZW1haW5pbmcgNjIlIG9mIGNvbmZsaWN0IGV2ZW50cy4gDQoNCjxicj4NCg0KYGBge3IgZHQtY29uZmxpY3QtdmlsbGFnZXN9DQphY2xlZCAlPiUNCiAgbXV0YXRlKGhhc192aWxsYWdlID0gZmN0X3JlbGV2ZWwoaGFzX3ZpbGxhZ2UsIGMoInllcyIsICJubyIpKSkgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIgJiBoYXNfdmlsbGFnZSA9PSAieWVzIikgJT4lDQogIGdyb3VwX2J5KHN0YXRlID0gYWRtaW4xLCB0b3duc2hpcCA9IGFkbWluMywgdmlsbGFnZSA9IGxvY2F0aW9uKSAlPiUgDQogIG11dGF0ZShldmVudF9jb3VudCA9IDEpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwgDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgIGJhdHRsZXMgPSBzdW0oZXZlbnRfY291bnRbZXZlbnRfdHlwZSA9PSAiQmF0dGxlcyJdKSwgDQogICAgICAgICAgICByZW1vdGVfdmlvbGVuY2UgPSBzdW0oZXZlbnRfY291bnRbZXZlbnRfdHlwZSA9PSAiRXhwbG9zaW9ucy9SZW1vdGUgdmlvbGVuY2UiXSksIA0KICAgICAgICAgICAgdmlvbGVuY2Vfdi5fY2l2aWxpYW5zID0gc3VtKGV2ZW50X2NvdW50W2V2ZW50X3R5cGUgPT0gIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIl0pLA0KICAgICAgICAgICAgbGF0aXR1ZGUgPSBtYXgobGF0aXR1ZGUpLA0KICAgICAgICAgICAgbG9uZ2l0dWRlID0gbWF4KGxvbmdpdHVkZSkpICU+JQ0KICBmaWx0ZXIodmlsbGFnZSAlb3V0JSBjKCJNYW5kYWxheSIsICJZYW5nb24iKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZmF0YWxpdGllcykpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksIA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJDYWxsYmFjayA9IERUOjpKUygiZnVuY3Rpb24odGhlYWQpIHsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgJCh0aGVhZCkuY3NzKCdmb250LXNpemUnLCAnLjhlbScpOyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJ9IikpLCANCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEyMCU7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIHRhYmxlIC0tIGNvbmZsaWN0LWFmZmVjdGVkIHZpbGxhZ2VzIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjZhIFNhbXBsZSBiZW5lZmljaWFyeSBzZWxlY3Rpb24gcHJvY2Vzcw0KDQpUaG91Z2ggcGFydG5lcnMgYXJlIGxpa2VseSB0byBhbHJlYWR5IGhhdmUgdGhlaXIgb3duIGJlbmVmaWNpYXJ5IHRhcmdldGluZyBwcm9jZWR1cmVzLCBiYXNlZCBvbiBXRlAncyBndWlkZWxpbmVzLCBhbiBleGFtcGxlIHRhcmdldGluZyBwcm9jZWR1cmUgaXMgbGlzdGVkIGJlbG93LCB3aXRoIHJlZmVyZW5jZSB0byB0aGUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGluIHRoaXMgZG9jdW1lbnQuIA0KDQoqKlNhbXBsZSB0YXJnZXRpbmcgcHJvY2VzcyoqDQoNCiogSWRlbnRpZmljYXRpb24gYW5kIHNlbGVjdGlvbiBvZiBnZW9ncmFwaGljYWwgYXJlYSANCiAgLSBTZWxlY3Rpb24gb2YgdG93bnNoaXAsIGZyb20gdGhlIHJlbGV2YW50IHByaW9yaXRpc2F0aW9uIGdyb3VwDQogIC0gQ29vcmRpbmF0aW9uIHdpdGggdGhlIENsdXN0ZXIgYW5kIENsdXN0ZXIgcGFydG5lcnMgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0aW9ucyBhbmQgdGhhdCBhcmVhcyBzZXJ2ZWQgYXJlIGluIGxpbmUgd2l0aCB0aGUgc2V2ZXJpdHkgYW5kIG1hZ25pdHVkZSBvZiBodW1hbml0YXJpYW4gbmVlZHMNCiAgLSBFbnN1cmUgdGhhdCBwcm9ncmFtbWluZyBpcyByZWZsZWN0aXZlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBhcmVhIHRhcmdldGVkIC0tIHJ1cmFsIG9yIHVyYmFuLCBjb25mbGljdC1hZmZlY3RlZCBvciBub3QgDQogIA0KKiBTZXQgdXAgY29tcGxhaW50cyBhbmQgZmVlZGJhY2sgbWVjaGFuaXNtIHRvIGVuc3VyZSB0aGF0IGlzc3VlcyBhbmQgY29uY2VybnMgcmFpc2VkIGJ5IGNvbW11bml0eSBtZW1iZXJzIGFyZSBhZGRyZXNzZWQgZWZmaWNpZW50bHkuIFRoZSBjb21wbGFpbnRzIGFuZCBmZWVkYmFjayBtZWNoYW5pc20gd2lsbCBiZSBhY3RpdmUgdGhyb3VnaG91dCB0aGlzIGVudGlyZSBwcm9jZXNzLiANCg0KKiBFbnVtZXJhdGlvbiBhbmQgaGVhZGNvdW50IG9mIGNvbW11bml0eSBtZW1iZXJzDQoNCiogRm9ybWF0aW9uIG9mIGJlbmVmaWNpYXJ5IHRhcmdldGluZyBjb21taXR0ZWUgd2hpY2ggaXMgcmVwcmVzZW50YXRpdmUgb2YgdGhlIGNvbW11bml0eQ0KDQoqIFByZXNlbnRhdGlvbiBvZiBkcmFmdCB0YXJnZXRpbmcgY3JpdGVyaWEsIGZvciBleGFtcGxlIChzZWxlY3RlZCBmcm9tIHZhcmlhYmxlcyBtb3N0IHByZWRpY3RpdmUgb2YgZm9vZCBpbnNlY3VyaXR5IGZyb20gc2VjdGlvbiAxLjEgYW5kIGRlY2lzaW9uIHRyZWVzKToNCiAgLSBIb3VzZWhvbGRzIHdoaWNoIGhhdmUgbG9zdCB3b3JrIG9mIGVtcGxveW1lbnQgb3Bwb3J0dW5pdGllcw0KICAtIEhvdXNlaG9sZHMgd2hpY2ggaGF2ZSBzdWZmZXJlZCBmcm9tIG5hdHVyYWwgaGF6YXJkcw0KICAtIEhvdXNlaG9sZHMgd2hpY2ggaGF2ZSBiZWVuIGFmZmVjdGVkIGJ5IGNvbmZsaWN0LCBpbnNlY3VyaXR5IG9yIHZpb2xlbmNlIA0KICAtIEhvdXNlaG9sZHMgd2hpY2ggcmVseSBvbiBjYXN1YWwsIG5vbi1hZ3JpY3VsdHVyYWwgbGFib3VyIGZvciBpbmNvbWUgDQogIC0gSG91c2Vob2xkcyB3aGljaCBoYXZlIG5vIGluY29tZSBzb3VyY2UgDQogIC0gSG91c2Vob2xkcyB3aG9zZSBoZWFkIGhhdmUgbm8gZWR1Y2F0aW9uYWwgYXR0YWlubWVudA0KICAtIEhvdXNlaG9sZHMgd2l0aCBjaGlsZHJlbiB1bmRlciA1IA0KICAtIEhvdXNlaG9sZHMgd2hvc2UgbWVtYmVycyBpbmNsdWRlIHBlcnNvbnMgd2l0aCBkaXNhYmlsaXRpZXMgDQogIA0KKiBTZW5zaXRpc2F0aW9uIGFuZCBjb25zdWx0YXRpb24gb24gYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhIGFuZCBmaW5hbGlzYXRpb24gb2Ygc2VsZWN0aW9uIGNyaXRlcmlhDQoNCiogRHJhZnRpbmcgb2YgYmVuZWZpY2lhcnkgbGlzdCAtLSBvbmx5IGhvdXNlaG9sZHMgd2hpY2ggbWVldCB0aGUgZXN0YWJsaXNoZWQgY3JpdGVyaWEgc2hvdWxkIGJlIGluY2x1ZGVkDQoNCiogUHVibGljIHBvc3Rpbmcgb2YgaW5pdGlhbCBiZW5lZmljaWFyeSBsaXN0LCBmb3IgcHVibGljIGNvbW1lbnQsIHR5cGljYWxseSBmb3IgYSBtYXhpbXVtIG9mIDUgZGF5cyANCg0KKiBTcG90IGNoZWNrcyBhbmQgdmVyaWZpY2F0aW9uIG9uIGEgcmFuZG9tIHNlbGVjdGlvbiBvZiBzZWxlY3RlZCBob3VzZWhvbGRzIA0KDQoqIEJlbmVmaWNpYXJ5IHJlZ2lzdHJhdGlvbiANCg0KDQo8YnI+PGJyPg0KDQojIyMgMi43IDVXIHJlc3VsdHMgZnJvbSB0aGUgZmlyc3QgcXVhcnRlciBvZiAyMDIyDQoNCkluIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMjIsIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgYSB0b3RhbCBvZiBgciBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyBvciBgciByb3VuZChzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAvIHN1bShmc19waW4kZnNfdGFyZ2V0ZWQpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSAyMDIyIHRhcmdldC4gQmVsb3cgaXMgYW4gZXhhbWluYXRpb24gb2YgdGhlIGV4dGVudCB0byB3aGljaCBwYXJ0bmVycyBoYXZlIHRhcmdldGVkIHRoZSB0b3duc2hpcHMgbW9zdCBhZmZlY3RlZCBieSBjb25mbGljdC4gDQoNCkluIHRoaXMgZmlyc3QgcGxvdCwgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAyMiBhcmUgcGxvdHRlZCBhZ2FpbnN0IHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uLiBFYWNoIHBvaW50IGlzIGEgdG93bnNoaXAgYW5kIHRoZSByZWQgbGluZSBkb3duIHRoZSBtaWRkbGUgcmVwcmVzZW50cyByZWFjaGluZyAxMDAlIG9mIHRoZSB0YXJnZXQuIEhvdyBmYXIgYWJvdmUgb3IgYmVsb3cgYSB0b3duc2hpcCBpcyBpbmRpY2F0ZXMgaG93IGZhciBhYm92ZSBvciBiZWxvdyB0aGUgdGFyZ2V0IGl0IGlzLiBBZGRpdGlvbmFsbHksIHRoZSB0b3duc2hpcCBwcmlvcml0aXNhdGlvbiBncm91cCBlYWNoIHRvd25zaGlwIGJlbG9uZ3MgdG8gaXMgbWFya2VkIGJ5IHRoZSBjb2xvdXIuIA0KDQpUaGUgdG93bnNoaXBzIG9uIHRoZSBmYXIgbGVmdCBvZiB0aGUgcGxvdCBoYXZlIGJlbmVmaWNpYXJpZXMgZGVzcGl0ZSBub3QgaGF2aW5nIHRhcmdldHMgZm9yIDIwMjIgKHRoZWlyIHRhcmdldHMgaGF2ZSBiZWVuIG5vbWluYWxseSBjb2RlZCBhcyAkMSQgc28gdGhleSBhcHBlYXIgb24gdGhlIHBsb3QpLiANCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHNwLXJlYWNoZWQtZ3JvdXBzfQ0KYmVuX3RhcmdldCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JSANCiAgcmlnaHRfam9pbihmc19waW4gJT4lIA0KICAgICAgICAgICAgICAgcmVuYW1lKGJlbmVmaWNpYXJpZXNfMjAyMiA9IGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIGZzX3RhcmdldGVkID0gaWZlbHNlKGZzX3RhcmdldGVkID09IDAgJiBiZW5lZmljaWFyaWVzID4gMCwgMSwgZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWRfcGMpKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIGZzX3BpbiwgZnNfdGFyZ2V0ZWQsIGJlbmVmaWNpYXJpZXMsIHJlYWNoZWRfcGMsIHBhcnRuZXJzLCBjbHVzdGVyKSAlPiUNCiAgbXV0YXRlKHBjX3RhcmdldCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBmc190YXJnZXRlZCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZnNfdGFyZ2V0ZWQsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBjbHVzdGVyLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXNfMjAyMjogIiwgYmVuZWZpY2lhcmllcywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXRfMjAyMjogIiwgZnNfdGFyZ2V0ZWQsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiJV9yZWFjaGVkOiAiLCBwY190YXJnZXQsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXJzXzIwMjI6ICIsIHBhcnRuZXJzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOiAiLCBjbHVzdGVyKSkpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChvcHRpb24gPSAiY2l2aWRpcyIpICsNCiAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM1NzVDNkRGRiIsICIjMDAyMDRERkYiLCAiI0M0QjU2Q0ZGIiwgIiNGRkVBNDZGRiIpKSArDQogIGxhYnMoeSA9ICJCZW5lZmljaWFyaWVzIiwgeCA9ICJUYXJnZXRlZCBwb3B1bGF0aW9uIiwgY29sb3VyID0gIkdyb3VwIiwgDQogICAgICAgdGl0bGUgPSAiVGFyZ2V0ZWQgcG9wdWxhdGlvbiBwZXIgdG93bnNoaXAgdnMgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIFExIDIwMjIsIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJUaGUgcmVkIGxpbmUgaXMgMTAwJSBvZiB0YXJnZXQiKQ0KDQpnZ3Bsb3RseShiZW5fdGFyZ2V0LCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSANCiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiVGFyZ2V0ZWQgcG9wdWxhdGlvbiBwZXIgdG93bnNoaXAgdnMgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIFExIDIwMjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeSBwcmlvcml0aXNhdGlvbiBncm91cDsgdGhlIHJlZCBsaW5lIGlzIDEwMCUgb2YgdGFyZ2V0OyBzaXplIGlzIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIjwvc3VwPiIpKSkNCmBgYA0KDQo8YnI+DQoNCldpdGggcmVmZXJlbmNlIHRvIHRoZSB0YWJsZSBiZWxvdywgMi44JSBvZiBiZW5lZmljaWFyaWVzIGNhbWUgZnJvbSBncm91cCBBMSBhbmQgMTAuNyUgb2YgYmVuZWZpY2lhcmllcyBjYW1lIGZyb20gZ3JvdXAgQTIuIE9uIHRoZSBzdXJmYWNlLCB0aGlzIHNlZW1zIGxpa2UgcGFydG5lcnMgaGF2ZSBtYWRlIGVmZm9ydCB0byByZWFjaCBjb25mbGljdC1hZmZlY3RlZCB0b3duc2hpcHMuIEhvd2V2ZXIsIHRoaXMgcmVhY2ggaGFzIGxhcmdlbHkgYmVlbiBkdWUgdG8gb3ZlcnN1YnNjcmlwdGlvbiBpbiBTaXR0d2UsIHdoZXJlIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDE1MiUgb2YgdGhlIHRhcmdldC4gDQoNClRoZSBkZXZlbG9wbWVudCBvZiB0aGUgcHJpb3JpdGlzYXRpb24gZ3JvdXBzIGFsc28gYnJpbmdzIHVwIHRoZSBicm9hZGVyIHBvaW50IG9mIHdoZXRoZXIgb3Igbm90IGNsdXN0ZXIgdGFyZ2V0cyBhcmUgaW4gbGluZSB3aXRoIG5lZWRzIGFuZCBpZiB0aGV5IHNob3VsZCBiZSByZWZvcm11bGF0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIG5vdyBhdmFpbGFibGUsIGFzIHRoZSB0YXJnZXRzIGluIGdyb3VwcyBCIGFuZCBDIGFyZSBub3RpY2VhYmx5IGhpZ2hlciB0aGFuIHRob3NlIGluIGdyb3VwIEEuIE5ldmVydGhlbGVzcywgaXQgaXMgaG9wZWQgdGhhdCBwYXJ0bmVycyB3aWxsIGJlIGFibGUgdG8gYWZmb3JkIHRvd25zaGlwcyBpbiBncm91cHMgQTEgYW5kIEEyIGdyZWF0ZXIgY292ZXJhZ2UgYXMgdGhlIHllYXIgcHJvZ3Jlc3Nlcy4gDQoNCjxicj4NCg0KYGBge3IgdGFibGUtcmVhY2hlZC1ncm91cH0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSkgJT4lIA0KICByaWdodF9qb2luKGZzX3BpbiAlPiUgIHNlbGVjdCgtYmVuZWZpY2lhcmllcyksIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lDQogIG11dGF0ZShnYXAgPSBpZmVsc2UoZnNfdGFyZ2V0ZWQgLSBiZW5lZmljaWFyaWVzIDw9IDAsIDAsIGZzX3RhcmdldGVkIC0gYmVuZWZpY2lhcmllcyksDQogICAgICAgICByZWFjaGVkX3BjID0gMSAtIGdhcCAvIGZzX3RhcmdldGVkLCANCiAgICAgICAgIGZzX3RhcmdldGVkID0gaWZlbHNlKGZzX3RhcmdldGVkID09IDAgJiBiZW5lZmljaWFyaWVzID4gMCwgMSwgZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgaGFzX2JlbmVmaWNpYXJpZXMgPSBpZmVsc2UoYmVuZWZpY2lhcmllcyA+IDAsIDEsIDApKSAlPiUgDQogIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBmc190YXJnZXRlZCA9IHN1bShmc190YXJnZXRlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBnYXAgPSBzdW0oZ2FwLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHRzcF9yZWFjaGVkID0gc3VtKGhhc19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0c3BfdG90YWwgPSBuKCkpICU+JSANCiAgbXV0YXRlKHBjX2dhcCA9IHJvdW5kKGdhcCAvIGZzX3RhcmdldGVkICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY19iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhmc190YXJnZXRlZCwgZ2FwKSwgfiByb3VuZCguKSkgJT4lIA0KICBzZWxlY3QoZ3JvdXAgPSBjbHVzdGVyLCBiZW5lZmljaWFyaWVzLCBgJV9iZW5gID0gcGNfYmVuLCB0YXJnZXQgPSBmc190YXJnZXRlZCwgDQogICAgICAgICBnYXAsIGAlX2dhcGAgPSBwY19nYXAsIHRzcF9yZWFjaGVkLCB0c3BfdG90YWwpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIyIFExIGJlbmVmaWNpYXJpZXMgYW5kIHBlcmNlbnQgcmVhY2hlZCBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoIkFueSByZWFjaCBhYm92ZSAxMDAlIGlzIGNvdW50ZWQgYXMgMTAwJTsgZXhjZWVkaW5nIHRoZSB0YXJnZXQgaW4gb25lIHRvd25zaGlwIGRvZXMgbm90IGFmZmVjdCBvdGhlciB0b3duc2hpcHMiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQpgYGANCg0KPGJyPg0KDQoNCk92ZXJhbGwsIHRoZXNlIGFyZSBub3QgZW5jb3VyYWdpbmcgcmVzdWx0cy4gTm90YWJseSwgb25seSBgciBmaWx0ZXIoZnNjLCBzdGF0ZSA9PSAiU2FnYWluZyIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyBiZWluZyByZWFjaGVkIGluIHRoZSB3aG9sZSBvZiBTYWdhaW5nLCB3aGVyZSB0aGUgZmlnaHRpbmcgaGFzIGJlZW4gaGVhdmllc3QuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGFyZ2V0cyBhbmQgcGxhbnMgZm9yIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgYmUgcmV2aWV3ZWQsIGFuZCBwYXJ0bmVycyBiZSByZW1pbmRlZCB0byByZWFsbG9jYXRlIHJlc291cmNlcyBhd2F5IGZyb20gb3ZlcnN1YnNjcmliZWQgYXJlYXMgYW5kIGF3YXkgZnJvbSBncm91cCBDLCB3aGljaCBhcmUgbmVpdGhlciBodW1hbml0YXJpYW4gbm9yIGRldmVsb3BtZW50IHByaW9yaXRpZXMuDQoNCjxicj48YnI+DQoNCiMjIyAyLjggTWFwcyBvZiBjb25mbGljdCBzY29yZXMgYW5kIHByaW9yaXRpc2F0aW9uIGdyb3VwDQoNCmBgYHtyIG1hcC1jb25mbGljdC1zY29yZSwgZmlnLmhlaWdodD05fQ0KDQpmc19waW4gJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gY29uZmxpY3Rfc2NvcmUpLCBzaXplID0gMC4xKSArIA0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiQ29uZmxpY3Qgc2NvcmUgYnkgdG93bnNoaXAgMjAyMSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgIGZpbGwgPSAiQ29uZmxpY3RcbnNjb3JlIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpKSArDQoNCmZzX3BpbiAlPiUgDQogIGxlZnRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjbHVzdGVyKSwgc2l6ZSA9IDAuMSwgY29sb3VyID0gImdyYXkyMCIpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU3NUM2REZGIiwgIiMwMDIwNERGRiIsICIjQzRCNTZDRkYiLCAiI0ZGRUE0NkZGIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gImNpdmlkaXMiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIGxhYnModGl0bGUgPSAiVG93bnNoaXBzIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIiwgDQogICAgICAgZmlsbCA9ICJQcmlvcmktXG50aXNhdGlvblxuZ3JvdXAiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIGFuZCBGU0MgY2FsY3VsYXRpb25zIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpKSAgDQogIA0KIyBnZ3NhdmUoImNvbmZsaWN0X3Njb3JlX21hcC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDEyLCB3aWR0aCA9IDcsIHVuaXRzID0gImluIikNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi45IFJlZmVyZW5jZSB0YWJsZSBmb3IgY29uZmxpY3QgdmFyaWFibGVzDQoNCkJlbG93IGlzIGFuIGludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgY29uZmxpY3QgZXZlbnRzIGJ5IHRvd25zaGlwLiBJdCBhbHNvIGluY2x1ZGVzIHRoZSBvdmVyYWxsIGNvbmZsaWN0IHNjb3JlIGFuZCBwcmlvcml0aXNhdGlvbiBncm91cHMuIFRoZSBzZWFyY2ggYmFyIGNhbiBiZSB1c2VkIHRvIGZpbmQgc3BlY2lmaWMgdG93bnNoaXBzLCBvciBhbnkgb2YgdGhlIGNvbHVtbnMgbWF5IGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgdmFsdWVzLiBUaGUgdGFibGUgY3VycmVudGx5IHNob3dzIHRvd25zaGlwcyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNvbmZsaWN0IHNjb3JlLiANCg0KPGJyPg0KDQpgYGB7ciBkdC1yZWZlcmVuY2UtdGFibGV9DQpmc19waW4gJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBwb3BfMjAyMSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qLCBwcGxfa20yID0gcG9wdWxhdGlvbl9kZW5zaXR5LCANCiAgICAgICAgIFBJTiA9IGZzX3BpbiwgdGFyZ2V0ID0gZnNfdGFyZ2V0ZWQsDQogICAgICAgICBncm91cCA9IGNsdXN0ZXIsIHZ1bG5lcmFiaWxpdHkgPSBtZHBfYWRqdXN0LCBjb25mbGljdF9zY29yZSwgZmF0YWxpdGllcywNCiAgICAgICAgIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCBwcm90ZXN0c19hbmRfcmlvdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIA0KICAgICAgICAgdmlvbGVuY2Vfdi5fY2l2aWxpYW5zID0gdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsDQogICAgICAgICBhZG1pbjNfcGNvZGUpICU+JSANCiAgYXJyYW5nZShkZXNjKGNvbmZsaWN0X3Njb3JlKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQ2FsbGJhY2sgPSBEVDo6SlMoImZ1bmN0aW9uKHRoZWFkKSB7IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICIgICQodGhlYWQpLmNzcygnZm9udC1zaXplJywgJy44ZW0nKTsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICJjYXB0aW9uLXNpZGU6IHRvcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTQwJTsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIxIGNvbmZsaWN0IGluZGljYXRvcnMgYnkgdG93bnNoaXAiKSkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJwb3BfMjAyMSIsICJwcGxfa20yIiwgInRhcmdldCIsICJQSU4iKSwgZGlnaXRzID0gMCkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJjb25mbGljdF9zY29yZSIsICJ2dWxuZXJhYmlsaXR5IiksIGRpZ2l0cyA9IDMpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCiANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyAzLiBEaXN0cmlidXRpb24gb2YgZmxvb2QgcmlzayBpbiBNeWFubWFyDQoNCg0KIyMjIDMuMSBIaXN0b3JpY2FsIGZsb29kIGRhdGEgDQoNCkluIGxpZ2h0IG9mIHRoZSBpbXBlbmRpbmcgbW9uc29vbiBzZWFzb24sIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgdG93bnNoaXAgd2lsbCBiZSBhZmZlY3RlZCBieSBhIG1ham9yIGZsb29kIG9yIGN5bGNvbmljIGV2ZW50IGhhcyBiZWVuIGNhbGN1bGF0ZWQuIE1ham9yIGZsb29kcyBzaW5jZSAyMDA4IGhhdmUgYmVlbiBmYWN0b3JlZCBpbnRvIHRoaXMgY2FsY3VsYXRpb24uIA0KDQpGb3IgdGhlIG1vbWVudCwgY29uZmxpY3QgaW5jaWRlbmNlIGFuZCBmbG9vZCBhbmQgY3ljbG9uZSByaXNrIHdpbGwgYmUgZXZhbHVhdGVkIHNlcGFyYXRlbHkuIEZsb29kIGFuZCBzdG9ybSBzdXJnZSByaXNrIGV4aXN0IGFzIHByb2JhYmlsaXRpZXMgZm9yIHRoZSBtb21lbnQgYW5kIGFyZSBpbnRlbmRlZCB0byBzdXBwb3J0IHByZXBvc2l0aW9uaW5nIGFuZCBEaXNhc3RlciBSaXNrIFJlZHVjdGlvbi4gVGhpcyBtaWdodCBjaGFuZ2Ugd2VyZSBzZXZlcmUgZmxvb2RpbmcgdG8gb2NjdXIgaW4gMjAyMi4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mbG9vZC1yaXNrfQ0KZmxvb2RzX3N0b3JtX3N1cmdlICU+JSANCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJ5ZWFyXyIpLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKC1hZG1pbjNfcGNvZGUpLCBuYW1lc190byA9ICJmbG9vZHMiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgDQogIG11dGF0ZShmbG9vZHMgPSBzdHJfcmVtb3ZlX2FsbChmbG9vZHMsICJ5ZWFyXyIpKSAlPiUgDQogIGdyb3VwX2J5KGZsb29kcykgJT4lIA0KICBmaWx0ZXIodmFsdWUgPT0gVFJVRSkgJT4lIA0KICBzdW1tYXJpc2UodG93bnNoaXBzX2FmZmVjdGVkID0gbigpKSAlPiUgDQogIG11dGF0ZShmbG9vZHMgPSBmY3RfcmV2KGZsb29kcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdG93bnNoaXBzX2FmZmVjdGVkLCB5ID0gZmxvb2RzLCBmaWxsID0gZmxvb2RzKSkgKyANCiAgZ2VvbV9jb2woKSArICANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHkgPSAiIiwgDQogICAgICAgeCA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIGFmZmVjdGVkIiwgDQogICAgICAgdGl0bGUgPSAiVG93bnNoaXBzIGFmZmVjdGVkIGJ5IGZsb29kcyBhbmQgc3Rvcm0gc3VyZ2VzICgyMDA4LTIwMjEpIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBNSU1VIGFuZCBVTkRQIikNCg0KICMgZ2dzYXZlKCJieV9mbG9vZHMucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDgsIHVuaXRzID0gImluIikNCmBgYA0KDQo8YnI+DQoNCkJhc2VkIG9uIHRoaXMgZGF0YSwgYSBzY29yZSB3YXMgY2FsY3VsYXRlZCBmb3IgZWFjaCB0b3duc2hpcCBiYXNlZCBvbiBob3cgbWFueSB0aW1lcyBpdCBoYWQgYmVlbiBhZmZlY3RlZCBieSBmbG9vZHMgc2luY2UgMjAwOC4gVGhlIHRhYmxlIGJlbG93IGFsc28gc3VtbWFyaXNlcyB0aGUgbnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkICgyMDIyKS4gYHIgZnNfcGluICU+JSBmaWx0ZXIoZmxvb2RfY291bnQgPiA0KSAlPiUge3N1bSguJGZzX3Bpbil9ICU+JSByb3VuZCgpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZW9wbGUgbGl2ZSBpbiB0b3duc2hpcHMgdGhhdCBoYXZlIGZsb29kZWQgbW9yZSB0aGFuIDUgdGltZXMgc2luY2UgMjAwOC4gDQoNCmBgYHtyfQ0KZnNfcGluICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGZsb29kX2NvdW50ID0gMCkpICU+JSANCiAgIyBtdXRhdGUoZmxvb2RfY291bnQgPSBpZmVsc2UoZmxvb2RfY291bnQgPiA0LCAiNS05IiwgZmxvb2RfY291bnQpKSAlPiUgDQogIGdyb3VwX2J5KGZsb29kX2NvdW50KSAlPiUgDQogIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuKCksDQogICAgICAgICAgICBwZW9wbGVfaW5fbmVlZCA9IHJvdW5kKHN1bShmc19waW4pLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZmxvb2RfY291bnQpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IG51bWJlciBvZiBmbG9vZHMgKDIwMDgtMjAyMSkiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBjb2x1bW5fc3BlYygxOjMsIHdpZHRoID0gIjhlbSIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlOiBNSU1VIGFuZCBVTkRQIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMiBNYXAgb2YgZmxvb2QgcmlzayANCg0KVGhlIG1hcCBiZWxvdyBzaG93cyB0aGUgcHJvYmFiaWxpdHkgb2YgZWFjaCB0b3duc2hpcCBiZWluZyBhZmZlY3RlZCBieSBmbG9vZHMuIFRoZSBhcmVhcyB3aXRoIHRoZSBncmVhdGVzdCByaXNrIG9mIGZsb29kaW5nIGFyZSBpbiBNb24sIG5lYXIgdGhlIG1vdXRoIG9mIHRoZSBTaXR0YXVuZyBSaXZlciBhbmQgdGhlIEd1bGYgb2YgTW90dGFtYSBhbmQgdGhvc2UgYWxvbmcgdGhlIEF5ZXlhcndhZHkgUml2ZXIsIGFuZCB0byBhIGxlc3NlciBleHRlbnQsIGFsb25nIHRoZSBDaGluZHdpbiBSaXZlci4gDQoNCjxicj4NCg0KYGBge3IgbWFwLWZsb29kcywgZmlnLmhlaWdodCA9IDEyfQ0KDQpmc19waW4gJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwgYWVzKGZpbGwgPSBmbG9vZF9wcm9iKSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIHNpemUgPSAwLjUsIGFscGhhID0gMCwgY29sb3VyID0gImdyYXkyMCIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCBkaXJlY3Rpb24gPSAtMSwgbGFiZWwgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGUgPSAiRmxvb2QgcmlzayBpbiBNeWFubWFyICgyMDA4LTIwMjEpIiwgDQogICAgICAgZmlsbCA9ICJmbG9vZFxucmlzayIsIA0KICAgICAgIGNhcHRpb24gPSAgIkRhdGEgc291cmNlOiBNSU1VIGFuZCBVTkRQIikNCg0KIyBnZ3NhdmUoImZsb29kX3Jpc2sucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSAxMiwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMyBSZWZlcmVuY2UgdGFibGUgZm9yIGZsb29kIHJpc2sgDQoNCkJlbG93IGlzIGFuIGludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBmb3IgZmxvb2QgcmlzayBieSB0b3duc2hpcC4gSXQgaW5jbHVkZXMgdGhlIG51bWJlciBvZiB0aW1lcyBzaW5jZSAyMDA4IGEgdG93bnNoaXAgaGFzIGJlZW4gYWZmZWN0ZWQgYnkgZmxvb2RpbmcgKGZsb29kX2NvdW50KSBhbmQgdGhlIHByb2JhYmlsaXR5IG9mIGZsb29kaW5nIChmbG9vZF9yaXNrKS4gU2ltaWxhciB0byB0aGUgaW50ZXJhY3RpdmUgdGFibGUgaW4gdGhlIHByZXZpb3VzIGNoYXB0ZXIsIHRoZSBzZWFyY2ggYmFyIGNhbiBiZSB1c2VkIHRvIGZpbmQgc3BlY2lmaWMgdG93bnNoaXBzIGFuZCBhbnkgb2YgdGhlIGNvbHVtbnMgbWF5IGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgdmFsdWVzLiBUaGUgdGFibGUgY3VycmVudGx5IHNob3dzIHRvd25zaGlwcyBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBmbG9vZCByaXNrLg0KDQo8YnI+DQoNCg0KYGBge3J9DQpmc19waW4gJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBwb3BfMjAyMSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qLCBwcGxfa20yID0gcG9wdWxhdGlvbl9kZW5zaXR5LCANCiAgICAgICAgIFBJTiA9IGZzX3BpbiwgdGFyZ2V0ID0gZnNfdGFyZ2V0ZWQsDQogICAgICAgICBmbG9vZF9yaXNrID0gZmxvb2RfcHJvYiwgZmxvb2RfY291bnQsDQogICAgICAgICBhZG1pbjNfcGNvZGUpICU+JSANCiAgYXJyYW5nZShkZXNjKGZsb29kX3Jpc2spKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAiY2FwdGlvbi1zaWRlOiB0b3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0MCU7IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxvb2QgcmlzayBieSB0b3duc2hpcCIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInBvcF8yMDIxIiwgInBwbF9rbTIiLCAidGFyZ2V0IiwgIlBJTiIpLCBkaWdpdHMgPSAwKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoImZsb29kX3Jpc2siKSwgZGlnaXRzID0gMikNCiANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyA0LiBUZWNobmljYWwgbm90ZXMNCg0KVGhlc2UgYW5uZXhlcyBjb250YWluIGFkZGl0aW9uYWwgdGVjaG5pY2FsIGluZm9ybWF0aW9uIHRoYXQgaW5mb3JtZWQgdGhlIGRlY2lzaW9ucyBpbiB0aGUgZWFybGllciBzZWN0aW9ucy4gDQoNCg0KIyMjIDQuMSBMaW1pdGF0aW9ucyBhbmQgbmV4dCBzdGVwcyANCg0KPGJyPg0KDQojIyMjIEZBTy1XRlAgZm9vZCBzZWN1cml0eSBzdXJ2ZXkgDQoNClRoZSBtb3N0IGltcG9ydGFudCBsaW1pdGF0aW9uIG9mIHRoZSBGQU8tV0ZQIHN1cnZleSB3YXMgdGhlIGV4Y2x1c2lvbiBvZiBzZXZlcmFsIGtleSBzdGF0ZXMgYW5kIHJlZ2lvbnMgZnJvbSB0aGUgc3VydmV5LiBPZiBwYXJ0aWN1bGFyIGludGVyZXN0IGFyZSBTYWdhaW5nLCBNYWd3YXkgYW5kIE1hbmRhbGF5IHdoZXJlIHRoZSBjb25mbGljdCBoYXMgYmVlbiBwYXJ0aWN1bGFybHkgaW50ZW5zZS4gDQoNCkZ1cnRoZXJtb3JlLCB0aGUgZHJ5IHpvbmUgd2FzIG5vdCBzdXJ2ZXllZC4gRnJvbSBhbiBhZ3JpY3VsdHVyYWwgcGVyc3BlY3RpdmUsIHRoaXMgaXMgYSBtYWpvciBvbWlzc2lvbiBhcyB0aGUgZGl2ZXJzaXR5IG9mIGNyb3BzIGFuZCwgY29uc2VxdWVudGx5LCBkaWV0cyBhcmUgbXVjaCBoaWdoZXIgaW4gdGhlIGRyeSB6b25lIHRoYW4gaW4gdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBjb3VudHJ5LCB3aGljaCBhcmUgcHJlZG9taW5hbnRseSBmb2N1c2VkIG9uIHBhZGR5Lg0KDQpBZGRpdGlvbmFsbHksIHRoZSB0YXJnZXRpbmcgcHJvY2VzcyBwcm9wb3NlZCBpbiB0aGlzIGRvY3VtZW50IGhhcyBub3QgeWV0IGJlZW4gdHJpYWxsZWQgaW4gdGhlIGZpZWxkLiBUaGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGRvZXMgbm90IGhhdmUgdGhlIHJlc291cmNlcyB0byB1bmRlcnRha2UgYSBmaWVsZCB0ZXN0IG9mIHRoaXMgc2NhbGUuIEhvd2V2ZXIsIGV2ZXJ5IGF0dGVtcHQgaGFzIGJlZW4gbWFkZSB0byBjb3Jyb2JvcmF0ZSB0aGUgZGF0YSBwcmVzZW50ZWQgaW4gaXQuIA0KDQpJbiBzcGl0ZSBvZiB0aGVzZSBtYWpvciBsaW1pdGF0aW9ucyBhbmQgdGhlIG51bWVyb3VzIGFzc3VtcHRpb25zIHRoYXQgaGF2ZSBoYWQgdG8gbWFkZSwgdGhlIEZBTy1XRlAgc3VydmV5IGlzIG1vc3QgY29tcHJlaGVuc2l2ZSBkYXRhc2V0IG9uIGZvb2Qgc2VjdXJpdHkgdGhhdCBoYXMgYmVlbiBjb2xsZWN0ZWQgc28gZmFyLiBBZGRpdGlvbmFsIGVmZm9ydHMgd2lsbCBiZSBtYWRlIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBkYXRhIGZyb20gdGhvc2Ugb2Ygb3RoZXIgc3VydmV5cy4gVGhlc2UgbW9kZWxzIHdpbGwgYmUgdXBkYXRlZCBvbmNlIHRoZSB0aGlyZCByb3VuZCBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgaXMgcmVhZHkuIEFzIGEgZmluYWwgcG9pbnQgaW4gdGhpcyBzZWN0aW9uLCB0aGUgRkFPLVdGUCBzdXJ2ZXksIGluIHNwaXRlIG9mIGl0cyBsaW1pdGF0aW9ucyBmb3JtcyB0aGUgYmFzaXMgb2YgdGhlIFBlb3BsZSBpbiBOZWVkIGNhbGN1bGF0aW9ucywgd2hpY2ggdW5kZXJwaW5zIGEgbG90IG9mIHRoZSByZXNwb25zZS4gDQoNClRoaXMgcGFwZXIgc2VydmVzIGEgcHJvcG9zYWwgb24gaG93IHZ1bG5lcmFibGUgaG91c2Vob2xkcyAoc3VjaCBhcyB0aG9zZSBpbiB0aGUgcHJpb3JpdHkgZ3JvdXApIG1heSBiZSBpZGVudGlmaWVkIGFuZCB0YXJnZXRlZC4gU2hvdWxkIHRoaXMgbWV0aG9kb2xvZ3kgcHJvdmUgc291bmQgYW5kIHZpYWJsZSwgaXQgaXMgc3VnZ2VzdGVkIHRoYXQgaXQgYmUgYXBwbGllZCB0byBlaXRoZXIgSUZQUkkncyBIb3VzZWhvbGQgV2VsZmFyZSBTdXJ2ZXkgYXMgd2VsbCBhcyBkYXRhIGNvbGxlY3RlZCBpbiB0aGUgdGhpcmQgcm91bmQgb2YgdGhlIEZBTy1XRlAgZm9vZCBzZWN1cml0eSBzdXJ2ZXkuIA0KDQo8YnI+PGJyPg0KDQojIyMjIE1JTVUtSEFSUCB2dWxuZXJhYmlsaXR5IGFuYWx5c2lzIA0KDQpUaGUgcmVzdWx0cyBvZiB0aGUgMjAxNSBbTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgQW5hbHlzaXNdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKSAodXNlZCB0byBpbmZvcm0gc2NvcmVzIGZvciBtdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkpLCBoYXZlIGJlZW4gdXBkYXRlZCB1c2luZyB0aGUgMjAxOSBJbnRlci1DZW5zYWwgU3VydmV5IHJlc3VsdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOiAgDQoNCiQkDQoyMDE5VHNwVmFsdWUgPSAyMDE1VHNwVmFsdWUgLyAyMDE1RGlzdHJpY3RWYWx1ZSBcY2RvdCAyMDE5RGlzdHJpY3RWYWx1ZQ0KJCQNCg0KVGhpcyBhbGxvd3MgdGhlIG5ldyB0b3duc2hpcCB2YWx1ZXMgdG8gdGFsbHkgd2l0aCB0aGUgMjAxOSBkaXN0cmljdC1sZXZlbCBpbnRlci1jZW5zYWwgc3VydmV5IHJlc3VsdHMgYXMgd2VsbCBhcyB0byBwcmVzZXJ2ZSB0aGUgb3JkZXIgYW5kIHJlbGF0aW9uc2hpcHMgb2YgdG93bnNoaXBzIHdpdGhpbiBlYWNoIGRpc3RyaWN0LiBGb3IgdGhlIHR3byBpbmRpY2F0b3JzIGluIHRoZSAyMDE1IGRhdGFzZXQgYnV0IG5vdCBjb3ZlcmVkIGluIHRoZSAyMDE5IGludGVyLWNlbnNhbCBzdXJ2ZXksIHRoZXkgd2VyZSBmb3J3YXJkIGZpbGxlZCwgdXNpbmcgdGhlaXIgMjAxNSB2YWx1ZXMuIFRvIGZ1cnRoZXIgaW1wcm92ZSB0aGVzZSBlc3RpbWF0aW9ucywgbXVsdGlwbGUgaW1wdXRhdGlvbiBzaG91bGQgYmUgZW1wbG95ZWQuIEJ1dCB0aGF0IHdpbGwgYmUgbGVmdCBmb3IgYW55IHN1YnNlcXVlbnQgcmV2aXNpb25zIHRvIHRoaXMgZG9jdW1lbnQuIA0KDQo8YnI+PGJyPg0KDQojIyMjIENvbmZsaWN0IGRhdGEgYW5kIEFDTEVEDQoNClBlcmhhcHMgdGhlIG1vc3Qga2V5IGxpbWl0YXRpb24gaGFzIGFsc28gYmVlbiB0aGUgbGFjayBvZiBmaWVsZCBhY2Nlc3MgYW5kIGRldGFpbGVkIGFzc2Vzc21lbnQgZGF0YSBmcm9tIG1hbnkgcGFydHMgb2YgdGhlIGNvdW50cnkuIFdpdGggdGhlIGNvbmZsaWN0IG9uZ29pbmcsIGFuZCB0aGUgZm9vdHByaW50cyBvZiBodW1hbml0YXJpYW4gYWdlbmNpZXMgbGFyZ2VseSBza2V3ZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUsIHdoaWNoIGhhdmUgYmVlbiBjb21wYXJhdGl2ZWx5IGxlc3MgYWZmZWN0ZWQgYnkgdGhlIGN1cnJlbnQgY3Jpc2lzLCB0aGVyZSBpcyBhIGRlbW9uc3RyYWJsZSBkZWFydGggb2YgZmlyc3QtaGFuZCBpbmZvcm1hdGlvbiBpbiBrZXkgYXJlYXMuIFRoaXMgZG9jdW1lbnQgaGFzIGludGVuZGVkIHRvIGNpcmN1bXZlbnQgdGhpcyB0aHJvdWdoIHRoZSB1c2Ugb2YgQUNMRUQgZGF0YSwgd2hpY2ggaXMgdGhlIG1vc3QgY29tcGxldGUgc2V0IG9mIGNvbmZsaWN0IGluY2lkZW50IGRhdGEgaW4gTXlhbm1hci4gDQoNCkhvd2V2ZXIsIHRoZSBBQ0xFRCBkYXRhc2V0IGlzIG5vdCB3aXRob3V0IGl0cyBsaW1pdGF0aW9ucyAtLSB0aGUgbWFqb3JpdHkgb2YgaXRzIGluZm9ybWF0aW9uLCBhYm91dCA4NSBwZXJjZW50LCBjb21lcyBmcm9tIHN1Ym5hdGlvbmFsLCBuYXRpb25hbCBhbmQgaW50ZXJuYXRpb25hbCBtZWRpYSBzb3VyY2VzLiBUaGUgcmVtYWluZGVyIGNvbWVzIGZyb20gQUNMRUTigJlzIHBhcnRuZXIsIHRoZSBNeWFubWFyIFBlYWNlIE1vbml0b3IsIGFuZCByZXBvcnRzIGZyb20gVU4gYWdlbmNpZXMsIGludGVybmF0aW9uYWwgbW9uaXRvcmluZyBncm91cHMsIGFuZCBsb2NhbCBodW1hbiByaWdodHMgb3JnYW5pc2F0aW9ucy4gVGhlIGNvbXBsZXRlbmVzcyBvZiB0aGUgY29uZmxpY3QgZGF0YSBhbmQgaG93IHJlcHJlc2VudGF0aXZlIGl0IGlzIG9mIHRoZSBzaXR1YXRpb24gb24gdGhlIGdyb3VuZCBpcyBub3Qgc29tZXRoaW5nIHRoYXQgaXMgZWFzaWx5IHZlcmlmaWFibGUuIFRob3VnaCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBBQ0xFRCBzdGlsbCBoYXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgY29tcHJlaGVuc2l2ZSBkYXRhc2V0IG9mIGNvbmZsaWN0IGluY2lkZW50cyBpbiBNeWFubWFyLiANCg0KPGJyPjxicj4NCg0KIyMjIyBUYXJnZXRpbmcgbGltaXRhdGlvbnMgDQoNClRoZSB0YXJnZXRpbmcgcHJvY2Vzc2VzIHByb3Bvc2VkIGluIHRoaXMgZG9jdW1lbnQgaGF2ZSBub3QgeWV0IGJlZW4gZmllbGQtdGVzdGVkLiBXaGlsc3QgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBpcyBjb25maWRlbnQgb2YgaXRzIGFuYWx5c2lzLCBpdCBkb2VzIG5vdCBoYXZlIHRoZSByZXNvdXJjZXMgdG8gdW5kZXJ0YWtlIGEgZmllbGQgdHJpYWwgdG8gdW5kZXJzdGFuZCBob3cgd2hhdCBoYXMgYmVlbiBwcm9wb3NlZCBoZXJlIHdpbGwgaW1wYWN0IG9wZXJhdGlvbnMuIEFjY2VzcyB0byBhZmZlY3RlZCBhcmVhcyBoYXMgYWxzbyBub3QgYmVlbiBjb25zaWRlcmVkLiANCg0KRmluYWxseSwgdGhlIHByaW9yaXRpc2F0aW9uIHByb2Nlc3MgaXMgbm90IGVudGlyZWx5IHNlYW1sZXNzIC0tIHdoaWxzdCBpdCBpcyBwb3NzaWJsZSB0byBwcmlvcml0aXNlIGZyb20gdGhlIHVuaW9uLWxldmVsIGRvd24gdG8gdGhlIHRvd25zaGlwIGxldmVsIGFuZCBmcm9tIHRoZSB2aWxsYWdlIGRvd24gdG8gdGhlIGhvdXNlaG9sZCB3aXRoIGZldyBpc3N1ZXMsIHRoZXJlIHJlbWFpbnMgYSBnYXAgYmV0d2VlbiB0aGUgdG93bnNoaXAgYW5kIHRoZSB2aWxsYWdlLiBJbiBsYXJnZSBwYXJ0LCB0aGlzIGlzIGR1ZSB0byB0aGUgZGVhcnRoIG9mIGRhdGEgYXZhaWxhYmxlIGF0IHRoZSB2aWxsYWdlLXRyYWN0IGFuZCB2aWxsYWdlIGxldmVscy4gVGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBoYXMgcGFydGlhbGx5IG1pdGlnYXRlZCB0aGlzIHRocm91Z2ggdGhlIHByb3Zpc2lvbiBvZiB2aWxsYWdlIG5hbWVzIGxpc3RlZCBpbiB0aGUgQUNMRUQgZGF0YXNldCwgYnV0IHRoaXMgaXMgYWxzbyBhIHBhcnRpYWwgbGlzdCBhbmQgbm90IGZ1bGx5IG1hdGNoZWQgYXQgdGhlIHZpbGxhZ2UtdHJhY3QgbGV2ZWxzIGVpdGhlci4gVW5sZXNzIHRoZXJlIGlzIGEgZnVsbCBlbnVtZXJhdGlvbiBvZiB2aWxsYWdlIHRyYWN0cyBhbmQgdmlsbGFnZXMgaW4gTXlhbm1hciwgdGhpcyBpc3N1ZSBpcyBsaWtlbHkgdG8gcGVyc2lzdC4gDQoNCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBGb29kIGluc2VjdXJpdHkgc2NvcmUNCg0KRm9vZCBpbnNlY3VyaXR5IGhlcmUgaXMgbm90IHJlY29nbmlzZWQgc29sZWx5IGFzIGEgZm9vZCBzZWN1cmUvZm9vZCBpbnNlY3VyZSBkaWNob3RvbXkgYW5kIGlzIGluc3RlYWQgdHJlYXRlZCBhcyBhIG1hdHRlciBvZiBkZWdyZWUgZGV0ZXJtaW5lZCBieSBhbiBob3VzZWhvbGQncyBwb3NpdGlvbiB0aGUgb3ZlcmFsbCBkaXN0cmlidXRpb24gb2YgZm9vZCBzZWN1cml0eSBpbmRpY2F0b3JzLiBBY2NvcmRpbmcgdG8gQmV0dGkgYW5kIFZlcm1hLCAiYnkgYXBwcm9wcmlhdGVseSB3ZWlnaHRpbmcgbm9uLW1vbmV0YXJ5IGluZGljYXRvcnMgb2YgZGVwcml2YXRpb24gdG8gcmVmbGVjdCB0aGVpciBkaXNwZXJzaW9uIGFuZCBjb3JyZWxhdGlvbiwgaXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHF1YW50aXRhdGl2ZSBpbmRpY2VzIG9mIGRlcHJpdmF0aW9uIGluIGl0cyB2YXJpb3VzIGRpbWVuc2lvbnMiLiBBdCBpdHMgbW9zdCBiYXNpYywgdGhlIGZvb2QgaW5zZWN1cml0eSBzY29yZSBpcyBhIHdlaWdodGVkIHN1bSBvZiBpdHMgY29tcG9uZW50IGluZGljYXRvcnMgdGhhdCByZXdhcmRzIHZhcmlhYmxlcyB0aGF0IGFyZSByZXNwb25zaWJsZSBmb3IgbW9yZSBvZiB0aGUgdmFyaWF0aW9uIGluIHRoZSBkYXRhc2V0LiANCg0KVG8gY2FsY3VsYXRlIHRoZSBGb29kIEluc2VjdXJpdHkgU2NvcmUsIHZhcmlhYmxlcyB3aXRoaW4gdGhlIExpdmVsaWhvb2QgQ29waW5nIFN0cmF0ZWdpZXMgSW5kZXgsIEZvb2QgQ29uc3VtcHRpb24gU2NvcmUgYW5kIEZvb2QgSW5zZWN1cml0eSBFeHBlcmllbmNlIHNjYWxlIHdlcmUgcmVzY2FsZWQgdG8gdmFsdWVzIGJldHdlZW4gJDAkIGFuZCAkMSQuIEZvciBtb3N0IG9mIHRoZSB2YXJpYWJsZXMsICQxJCBtZWFudCAieWVzIiBhbmQgJDAkIG1lYW50ICJubyI7IGhvd2V2ZXIsIGZvciB0aGUgRm9vZCBDb25zdW1wdGlvbiBTY29yZSBpbmRpY2F0b3JzLCAkMCQgbWVhbnQgdGhhdCBhIGhvdXNlaG9sZCBoYWQgY29uc3VtZWQgdGhhdCBmb29kIGdyb3VwIGV2ZXJ5IGRheSBmb3IgdGhlIHBhc3QgNyBkYXlzIGFuZCAkMSQgbWVhbnQgdGhhdCBhIGhvdXNlaG9sZCBoYWQgbm90IGNvbnN1bWVkIHRoYXQgZm9vZCBncm91cCBmb3IgYW55IG9mIHRoZSBwcmlvciA3IGRheXMuIEFkZGl0aW9uYWxseSwgY29waW5nIHN0cmF0ZWdpZXMgaW5kaWNhdG9ycyBhdCB0aGUgImNyaXNpcyIgbGV2ZWwgd2VyZSBjb2RlZCBhcyAkMC41JCBmb3IgInllcyIgYW5kIGluZGljYXRvcnMgYXQgdGhlICJlbWVyZ2VuY3kiIGxldmVsIHdlcmUgY29kZWQgYXMgJDEkIGZvciAieWVzIi4gVGhpcyBpcyB0byByZXBsYWNlIHRoZSB0eXBpY2FsIHNldmVyaXR5IHdlaWdodGluZyB0aGF0IHdvdWxkIG5vcm1hbGx5IGhhdmUgb2NjdXJyZWQgYnV0IHdhcyBub3QgcGFydCBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgcHJvY2Vzcy4gDQoNClRoZXNlIGNhbGN1bGF0aW9ucyBoYXZlIGJlZW4gZW5jb2RlZCBpbiB0aGUgUiBwYWNrYWdlICoqYG1kZXByaXZgKiogYnkgQXR0aWxpbyBhbmQgQWxkbyBCZW5pbmksIGJ1aWxkaW5nIG9uIHdvcmsgZG9uZSBieSBBbHBlcmluIGFuZCBWYW4gS2VybSBvbiB0aGVpciAqKmBtZGVwcml2YCoqIFN0YXRhIHBhY2thZ2UuIEFjY29yZGluZyB0byBBbHBlcmluIGFuZCBWYW4gS2VybSwgIioqYG1kZXByaXZgKiogY3JlYXRlcyBzeW50aGV0aWMgc2NvcmVzIG9mIGRlcHJpdmF0aW9uIHRoYXQgYXJlIGxpbmVhciBmdW5jdGlvbnMgb2YgdW5pLWRpbWVuc2lvbmFsIGRlcHJpdmF0aW9uIGl0ZW1zIG1lYXN1cmVkIG9uIHRoZSBbMCwgMV0gc2NhbGUuIFdpdGggJHhfe2lqfSQgZGVub3RpbmcgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBkZXByaXZhdGlvbiBpdGVtcyAkaiQgZm9yIG9ic2VydmF0aW9uICRpJC4gVGhlIHN5bnRoZXRpYyBzY29yZXMgY2FsY3VsYXRlZCBieSAqKmBtZGVwcml2YCoqIGFyZSB3ZWlnaHRlZCBzdW1zIG9mIHRoZSAkTSQgZGVwcml2YXRpb24gaXRlbXM6IA0KDQokJA0Kc19pID0gXHN1bV97aiA9IDF9XntNfXt3X2p9eF97aWp9DQokJA0KDQpBIGZvb2QgaW5zZWN1cml0eSBzY29yZSB3YXMgdGhlbiBjYWxjdWxhdGVkIHVzaW5nIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGluZGl2aWR1YWwgdmFyaWFibGVzLiBUaGUgd2VpZ2h0aW5nIHNjaGVtZSBjaG9zZW4gd2FzIHRoZSBkZWZhdWx0IGZvciB0aGUgKipgbWRlcHJpdmAqKiBwYWNrYWdlLCBDZXJpb2xpIGFuZCBaYW5pICgxOTkwKSB3ZWlnaHRpbmcuIFVuZGVyIHRoaXMgd2VpZ2h0aW5nIHNjaGVtZSwgdmFyaWFibGUgd2VpZ2h0cyBhcmUgImZyZXF1ZW5jeS1iYXNlZCIgYW5kIGFyZSBhIGZ1bmN0aW9uIG9mIHRoZWlyIHNhbXBsZSBtZWFuIGJ1dCBqdXN0IHNsaWdodGx5IG1vZGlmaWVkIHRvIGdpdmUgYSBzdHJvbmdlciB3ZWlnaHQgdG8gcmVsYXRpdmVseSByYXJlIGl0ZW1zIHNvIHRoYXQgdmFyaWF0aW9uIGlzIHJld2FyZGVkOiANCg0KJCQNCndfaiBccHJvcHRvIGxvZyhcZnJhY3sxfXtcYmFye3h9X2p9KQ0KJCQNCjxicj4NCg0KVGhlIHNwZWNpZmljIGNvZGUgZm9yIGdlbmVyYXRpbmcgdGhlIGZvb2QgaW5zZWN1cml0eSBzY29yZSB3YXM6DQoNCmBgYHtyIGVjaG8gPSBUUlVFfQ0KZm9vZF9pbnNlY3VyaXR5X3Njb3JlIDwtIHN1cnZleSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCANCiAgICAgICAgICAgICAgICAgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCksIH4gLiAqIDAuNSkgJT4lIA0KICBzZWxlY3Qoc3VydmV5X2lkLCBoaGZjc19pbnYsICMgaW52ZXJzZSBvZiBmb29kIGNvbnN1bXB0aW9uIHNjb3JlDQogICAgICAgICBjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgDQogICAgICAgICBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwLCBjc19lbWVyZ2VuY3lfc29sZF9ob3VzZSwgDQogICAgICAgICBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uLCBjc19lbWVyZ2VuY3lfaGhfcmlzaywNCiAgICAgICAgIGZpZXNfZmV3Zm9vZCwgZmllc19za2lwcGVkLCBmaWVzX3dobGRheSwgZmllc19odW5ncnksIA0KICAgICAgICAgZmllc19hdGVsZXNzLCBmaWVzX2hlYWx0aHksIGZpZXNfcnVub3V0LCBmaWVzX3dvcnJpZWQsIGNvbWJpbmVkX3d0KSAlPiUgDQogIG1kZXByaXYoYygiaGhmY3NfaW52IiwgDQogICAgICAgICAiY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMiLCAiY3NfY3Jpc2lzX25vX3NjaG9vbCIsIA0KICAgICAgICAgImNzX2NyaXNpc19yZWR1Y2VkX2hlYWx0aF9leHAiLCAiY3NfZW1lcmdlbmN5X3NvbGRfaG91c2UiLCANCiAgICAgICAgICJjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uIiwgImNzX2VtZXJnZW5jeV9oaF9yaXNrIiwNCiAgICAgICAgICJmaWVzX2Zld2Zvb2QiLCAiZmllc19za2lwcGVkIiwgImZpZXNfd2hsZGF5IiwgImZpZXNfaHVuZ3J5IiwgDQogICAgICAgICAiZmllc19hdGVsZXNzIiwgImZpZXNfaGVhbHRoeSIsICJmaWVzX3J1bm91dCIsICJmaWVzX3dvcnJpZWQiKSwgDQogICAgICAgICBvdXRwdXQgPSAiYWxsIiwgc2FtcGxpbmdfd2VpZ2h0cyA9ICJjb21iaW5lZF93dCIpDQoNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyA0LjMgTGltaXRlZCBwZXJmb3JtYW5jZSBvZiBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMNCg0KUHJpb3IgdG8gdGhlIGRldmVsb3BtZW50IG9mIHRoZSBkZWNpc2lvbiB0cmVlcyBkZXRhaWxlZCBpbiBzZWN0aW9uIDEuMywgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBoYWQgYmVlbiBjb25zaWRlcmVkLiBIb3dldmVyLCBubyBtYXR0ZXIgaG93IHNvcGhpc3RpY2F0ZWQgdGhlIG1ldGhvZCwgdGhlIGhpZ2hlc3Qgci1zcXVhcmVkIGFjaGlldmVkIHdhcyAwLjEzNiAoYSBtb2RlbCB3aXRoIGFuIHItc3F1YXJlZCB3aXRoIDEgd291bGQgbWVhbiBpdCB3YXMgcGVyZmVjdGx5IHByZWRpY3RpdmUgYW5kIGFuIHItc3F1YXJlZCBvZiAwIG1lYW5zIHRoYXQgYSBtb2RlbCBkb2VzIG5vdCBwcmVkaWN0IGFueSBvZiB0aGUgdmFyaWFuY2UgYXQgYWxsOyBpbiB0aGlzIGNhc2UsIHRoZSBiZXN0IGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHN0aWxsIGxlZnQgODYlIG9mIHRoZSB2YXJpYW5jZSB1bmV4cGxhaW5lZCkuIA0KDQpXaXRoIHJlZmVyZW5jZSB0byB0aGUgcGxvdCBiZWxvdyBvZiBwcmVkaWN0ZWQgdmFsdWVzIG9mIHRoZSBmb29kIHNlY3VyaXR5IHNjb3JlIHZzIHRoZSBhY3R1YWwgdmFsdWVzIChvZiB0aGUgYmVzdCBwZXJmb3JtaW5nIG1vZGVsKSwgd2hpbHN0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwLCBpdHMgcHJlZGljdGl2ZSBwZXJmb3JtYW5jZSBpcyB0b28gd2Vhay4gVGhpcyB3YXMgd2h5IGRlY2lzaW9uIHRyZWVzIHdlcmUgZW1wbG95ZWQgaW5zdGVhZCBvZiBhIGxpbmVhciBtb2RlbC4gRWFjaCBwb2ludCBpbiB0aGUgcGxvdCBiZWxvdyBpcyBhIGhvdXNlaG9sZCBpbiB0aGUgc3VydmV5LiANCg0KPGJyPg0KDQpgYGB7cn0NCm9scyA8LSBzdXJ2ZXkgJT4lIHNlbGVjdChmc19zY29yZTQsIGhvaF9mZW1hbGUsIHJ1cmFsLCBub3RfaW1wcm92ZWRfc2FuaXRhdGlvbiwgDQogICAgICAgICBjb250YWlucygiZWR1XyIpLCBjb250YWlucygic2hvY2tzXyIpLCBjb250YWlucygiaW5jb21lX21zIiksIHN1cnZleV9pZCkgJT4lIA0KICBsZWZ0X2pvaW4oc3VydmV5ICU+JSBzZWxlY3Qoc3VydmV5X2lkLCBob2hfYWdlKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHZhbHVlID0gMSkgJT4lDQogICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBob2hfYWdlLCB2YWx1ZXNfZnJvbSA9IHZhbHVlLCB2YWx1ZXNfZmlsbCA9IDApICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoLWBOQWApLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIHNlbGVjdCgtc3VydmV5X2lkKSAlPiUNCiAgI3NsaWNlKC1jKCA2OSwgMjk3LCAgNjYwLCAxMTg2LCAxMjIyLCAxMjU2LCAxMzU0LCAxMzYyLCAxNzIwLCANCiAgIyAgICAgICAgICAxODIwLCAxODIzLCAxODQzLCAxOTM2LCAxOTUwLCAxOTUyLCAyMDAzLCAyMTMyLCAyMzI5LCAyNTk0KSkgJT4lIA0KICBkcm9wX25hKCkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmU0ID0gbG9nKGZzX3Njb3JlNCksIA0KICAgICAgICAgZnNfc2NvcmU0ID0gaWZlbHNlKGlzLmluZmluaXRlKGZzX3Njb3JlNCksIDAsIGZzX3Njb3JlNCkpICU+JSANCiAgbG0oZnNfc2NvcmU0IH4gLiArIGhvaF9mZW1hbGU6YWdlX292ZXI2NSwgZGF0YSA9IC4pIA0KDQpzdXJ2ZXkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwcmVkaWN0KG9scyksIHkgPSBsb2coZnNfc2NvcmU0KSkpICsgDQogIGdlb21fcG9pbnQoYWxwaGEgPSAuNSkgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgbGFicyh4ID0gIkxvZyBvZiBwcmVkaWN0ZWQgdmFsdWVzIiwgeSA9ICJMb2cgb2YgYWN0dWFsIHZhbHVlcyIsIA0KICAgICAgIHRpdGxlID0gIlByZWRpY3RlZCB2cyBhY3R1YWwgdmFsdWVzIGZvciB0aGUgZm9vZCBpbnNlY3VyaXR5IHNjb3JlIikNCg0KDQpgYGANCg0KPGJyPg0KDQpUaGUgcmVsYXRpdmVseSBsb3cgci1zcXVhcmVkIGlzIGxpa2VseSBkdWUgdG8gbWlzc2luZyB2YXJpYWJsZXMgaW4gdGhlIEZBTy1XRlAgc3VydmV5LiBGb3IgaW5zdGFuY2UsIHRoZSBmYWN0b3JzIHRoYXQgZ28gaW50byBhIGhvdXNlaG9sZCdzIGRlY2lzaW9uIHRvIHJlZHVjZSB0aGVpciBoZWFsdGhjYXJlIGV4cGVuZGl0dXJlcyBhcmUgdG9vIG11bHRpZmFyaW91cyB0byBiZSBjYXB0dXJlZCBieSBhIHN1cnZleSBvbiBmb29kIHNlY3VyaXR5LiANCg0KVGhpcyBwYXR0ZXJuIHdhcyBhbHNvIHRydWUgZm9yIHRoZSBvdmVyYWxsIGZvb2Qgc2VjdXJpdHkgc2NvcmUgYXMgd2VsbCBhcyB0aGUgaW5kaXZpZHVhbCBmb29kIHNlY3VyaXR5IGluZGljZXMgKEZvb2QgQ29uc3VtcHRpb24gU2NvcmUsIEZvb2QgSW5zZWN1cml0eSBFeHBlcmllbmNlIFNjYWxlIGFuZCBDb3BpbmcgU3RyYXRlZ2llcyBJbmRleCkuDQoNCkZvciBhZGRpdGlvbmFsIHJlZmVyZW5jZSwgdGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSB0b3AgMTUgdmFyaWFibGVzIHJhbmtlZCBieSB0aGUgcGVyY2VudGFnZSBvZiB2YXJpYW5jZSBvZiB0aGUgZm9vZCBzZWN1cml0eSBzY29yZSB0aGF0IHRoZXkgZXhwbGFpbi4gDQoNCg0KYGBge3IgdGFibGUtcGMtdmFyaWFuY2V9DQpvbHMgJT4lIA0KICBhbm92YSgpICU+JSANCiAgdGlkeSgpICU+JSANCiAgbXV0YXRlKHBjX3ZhcmlhbmNlID0gc3Vtc3EgLyBzdW0oc3Vtc3EpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwY192YXJpYW5jZSkpICU+JSANCiAgc2VsZWN0KHRlcm0sIHBjX3ZhcmlhbmNlKSAlPiUgDQogIG11dGF0ZShwY192YXJpYW5jZSA9IHJvdW5kKHBjX3ZhcmlhbmNlICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBoZWFkKDE1KSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVmFyaWFibGVzIHJhbmtlZCBieSBwZXJjZW50IG9mIHZhcmlhbmNlIikgJT4lIA0KICBjb2x1bW5fc3BlYygxOjIsIHdpZHRoID0gIjhlbSIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KDQpgYGANCg0KPGJyPiANCg0KQXMgYSAgcG9pbnQgb2YgcmVmZXJlbmNlLCBiZWxvdyBpcyB0aGUgY29kZSBmb3IgdGhlIGRlY2lzaW9uIHRyZWUuIA0KDQpgYGB7ciBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KdHJlZV9lbnZpcm9ubWVudF9jaXJjdW1zdGFuY2VzIDwtIHN1cnZleSAlPiUgDQogIHJwYXJ0KHByaW9yaXR5IH4gIHNob2Nrc19sb3N0d29yayArIHNob2Nrc19zaWNrbmVzc2RlYXRoICsgc2hvY2tzX2Zvb2RwcmljZXMgKyANCiAgICAgICAgICBzaG9ja3NfY29uZmxpY3QgKyBzaG9ja3NfY2FudHdvcmtidXNpbmVzcyArIHNob2Nrc19uYXR1cmFsaGF6YXJkICsgDQogICAgICAgICAgc2hvY2tzX2FjY2Vzc21hcmtldCArIHNob2Nrc19wcmljZXNvdGhlciArIHNob2Nrc19vdGhlciArIA0KICAgICAgICAgIHJ1cmFsICsgbm90X2ltcHJvdmVkX3Nhbml0YXRpb24sDQogICAgICAgIGRhdGEgPSAuLCAgd2VpZ2h0cyA9IGNvbWJpbmVkX3d0ICwgY3AgPSAwLjAxKQ0KDQp0cmVlX2RlbW9ncmFwaGljcyA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGUoY2hpbGRyZW5fMF80ID0gaWZlbHNlKGNoaWxkcmVuXzBfNCA+IDAsIDEsIDApKSAlPiUgDQogIHJwYXJ0KHByaW9yaXR5IH4gY2hpbGRyZW5fMF80ICsgaG9oX2ZlbWFsZSArIGhvaF9lZHVjYXRpb24gKyBob2hfYWdlLCANCiAgICAgICAgZGF0YSA9IC4sIHdlaWdodHMgPSBjb21iaW5lZF93dCwgY3AgPSAuMDA4OCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC40IFBhaXJ3aXNlIGNvcnJlbGF0aW9ucyBvZiBpbmRpY2F0b3JzIGluIHRoZSBGQU8tV0ZQIHN1cnZleQ0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIHRvcCAyMCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IHZhcmlhYmxlcyBjb2xsZWN0ZWQgYnkgdGhlIEZBTy1XRlAgZm9vZCBzZWN1cml0eSBzdXJ2ZXkuIFdoZW4gYSBwYXJ0aWN1bGFyIHZhcmlhYmxlIGlzIG9mIGludGVyZXN0LCBpdCBtYXkgYmUgdXNlZnVsIGFuZCBpbnRlcmVzdGluZyB0byBzZWUgd2hpY2ggb3RoZXIgdmFyaWFibGVzIGl0IGlzIG1vc3QgY29ycmVsYXRlZCB3aXRoLiANCg0KVGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIHZhcmlhYmxlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGNvbXBvc2l0ZSBzY29yZXMgYW5kIGluZGljZXMsIGFyZSBiaW5hcnksIHdpdGggMSBiZWluZyB0cnVlIGFuZCAwIGJlaW5nIGZhbHNlLiBJbiB0aGVzZSBjYXNlcywgYSBjb3JyZWxhdGlvbiBvZiAxIHdvdWxkIG1lYW4gdGhhdCBhIHZhcmlhYmxlIGlzIHRydWUgZm9yIGFsbCB0aGUgaG91c2Vob2xkcyBpbiB3aGljaCBpdHMgbWF0Y2ggaXMgYWxzbyB0cnVlOyBhIGNvcnJlbGF0aW9uIG9mIDAuNSBtZWFucyB0aGF0IGEgdmFyaWFibGUgaXMgdHJ1ZSBmb3IgNTAlIG9mIHRoZSBob3VzZWhvbGRzIGluIHdoaWNoIGl0cyBtYXRjaCBpcyB0cnVlLiANCg0KRm9yIGluc3RhbmNlLCB3aGV0aGVyIG9yIG5vdCB0aGUgaGVhZCBvZiB0aGUgaG91c2Vob2xkIGhhcyBjb21wZXRlZCBlZHVjYXRpb24gKCplZHVfaGlnaGVyKikgaXMgbW9zdCBjb3JyZWxhdGVkIHdpdGggaG91c2Vob2xkcyB3aG9zZSBtYWluIGluY29tZSBzb3VyY2UgaXMgc3RhYmxlIG5vbi1hZ3JpY3VsdHVyYWwgaW5jb21lICgqaW5jb21lX21zX3N0YWJsZV9ub25fYWcqKS4gU2ltaWxhcmx5LCBhIGNvcnJlbGF0aW9uIG9mIDAuMTc1IGJldHdlZW4gKnJ1cmFsKiBhbmQgKmVkdV9ub25lKiBpbmRpY2F0ZXMgdGhhdCBpbiAxNy41JSBvZiBhbGwgcnVyYWwgaG91c2Vob2xkcywgdGhlIGhlYWQgb2YgaG91c2Vob2xkIGhhcyBubyBmb3JtYWwgZWR1Y2F0aW9uYWwgYXR0YWlubWVudC4gSXQgYWxzbyBzaG91bGQgYmUgbm90ZWQgdGhhdCwgYXMgZXhwZWN0ZWQsIHRoZSBjb21wb25lbnRzIG9mIGVhY2ggb2YgdGhlIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyBhcmUgbW9zdCBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlci4gDQoNCjxicj4NCg0KYGBge3J9DQpzdXJ2ZXlfbG9uZyAlPiUNCiAgZ3JvdXBfYnkodmFyKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IGlmZWxzZSh2YWx1ZSA+IDAsIDEsIDApLA0KICAgICAgICAgY291bnQgPSBzdW0oY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcihjb3VudCA+IDUwKSAlPiUgIyBhZGp1c3QgdGhlIHRocmVzaG9sZCBuDQogIHBhaXJ3aXNlX2Nvcih2YXIsIHN1cnZleV9pZCwgdmFsdWUgPSB2YWx1ZSwgc29ydCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHZhcmlhYmxlID0gaXRlbTEsIG1hdGNoID0gaXRlbTIpICU+JSANCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSANCiAgdG9wX24oYWJzKGNvcnJlbGF0aW9uKSwgbiA9IDIwKSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSAlb3V0JSBjKCJsaGNzaV9yYW5nZSIsICJsaGNzaV9tYXgiLCAiZmllc19yYXdfcmFuZ2UiLCAiZmllc19yYXciLCANCiAgICAgICAgICAgICAgICAgICAgICAiZnNfc2NvcmUiLCAiZnNfc2NvcmUyIiwgImZzX3Njb3JlMyIsICJmc19zY29yZTQiLA0KICAgICAgICAgICAgICAgICAgICAgICJjc2lfd2VpZ2h0ZWQiLCAicHJpb3JpdHkiLCAiaGhmY3NfaW52IikpICU+JSANCiAgZmlsdGVyKG1hdGNoICVvdXQlIGMoImxoY3NpX3JhbmdlIiwgImxoY3NpX21heCIsICJmaWVzX3Jhd19yYW5nZSIsICJmaWVzX3JhdyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJmc19zY29yZSIsICJmc19zY29yZTIiLCAiZnNfc2NvcmUzIiwgImZzX3Njb3JlNCIsDQogICAgICAgICAgICAgICAgICAgICAgImNzaV93ZWlnaHRlZCIsICJwcmlvcml0eSIsICJoaGZjc19pbnYiKSkgJT4lDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaCA9IGxpc3QocmVnZXggPSBUUlVFKSkpICU+JSANCiAgZm9ybWF0Um91bmQoYygiY29ycmVsYXRpb24iKSwgZGlnaXRzID0gMykNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC41IENhbGN1bGF0aW5nIHRoZSBjb25mbGljdCBzY29yZQ0KDQpUaGUgY29uZmxpY3Qgc2NvcmUgaGVyZSBvcmlnaW5hbGx5IGFwcGVhcmVkIGluIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIncyByZXBvcnQgW1VuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmVdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLykuIEl0IHdhcyBjYWxjdWxhdGVkIHVzaW5nIEFDTEVEIGRhdGEgYW5kIHlpZWxkcyBhIHNjb3JlIGZvciBlYWNoIHRvd25zaGlwLiANCg0KVGhlIGNvbmZsaWN0IHNjb3JlIGlzIGFuIHVwZGF0ZSBvZiB0aGUgY29uZmxpY3QgaW5kZXggaW4gdGhlIFtNSU1VLUhBUlAgVnVsbmVyYWJpbGl0eSBBbmFseXNpc10oaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIpLCB1c2luZyAyMDIxIGRhdGEuIFRoZSBzcGVjaWZpYyBjb25mbGljdCB2YXJpYWJsZXMgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2NvcmUgd2VyZSBiYXR0bGVzLCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIG5vbi1wZWFjZWZ1bCBwcm90ZXN0cyBhbmQgcmlvdHMsIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcywgc3RyYXRlZ2ljIGRldmVsb3BtZW50cyBhbmQgbnVtYmVyIG9mIElEUHMuIE9ubHkgdGhlIHZlcnNpb24gb2YgdGhlIGNvbmZsaWN0IHNjb3JlIHdpdGhpbiB0aGlzIGRvY3VtZW50IHRha2VzIElEUHMgaW50byBhY2NvdW50OyBpbiB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyJ3MgZWFybGllciByZXBvcnQgb24gY29uZmxpY3QgKGxpbmtlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoKSwgdGhlIENsdXN0ZXIgZGlkIG5vdCB5ZXQgaGF2ZSBhY2Nlc3MgdG8gZGV0YWlsZWQgSURQIGRhdGEuIA0KDQpUaGUgY29uZmxpY3Qgc2NvcmUgaXMgYW4gYXZlcmFnZSBvZiB0aGUgbm9ybWFsaXNlZCB2YWx1ZXMgb2Yga2V5IGNvbmZsaWN0IGluZGljYXRvcnMuIEl0cyBtYWluIHVzZSBpdCB0byBhaWQgZGVjaXNpb25zIGFib3V0IGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24uIFRoZXNlIG5vcm1hbGlzZWQgdmFsdWVzIGhhdmUgYmVlbiByZS13ZWlnaHRlZCB3aXRoIEJldHRpLVZlcm1hIG1ldGhvZCwgd2hpY2ggcGVuYWxpc2VzIHJlZHVuZGFuY3kgYW5kIHJld2FyZHMgdmFyaWF0aW9uOyB0aGlzIGlzIHRoZSBvbmx5IG5vdGFibGUgZGl2ZXJnZW5jZSBmcm9tIHRoZSBNSU1VLUhBUlAgbWV0aG9kb2xvZ3kuIFRoZSBCZXR0aS1WZXJtYSBtZXRob2Qgd2FzIGVtcGxveWVkIHRocm91Z2ggdGhlICoqYG1kZXByaXZgKiogcGFja2FnZSBkZXZlbG9wZWQgYnkgQXR0aWxpbyBhbmQgQWxkbyBCZW5pbmkuDQoNClVubGlrZSB0aGUgRm9vZCBJbnNlY3VyaXR5IFNjb3JlLCB0aGUgY29tcG9uZW50IHZhcmlhYmxlcyBvZiB0aGUgY29uZmxpY3QgaW5kZXggd2VyZSBub3QgYmluYXJ5LCBtZWFuaW5nIHRoYXQgaXQgd2FzIHBvc3NpYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBCZXR0aS1WZXJtYSBtZXRob2QncyBkb3VibGUtd2VpZ2h0aW5nIHJ1bGUgd2hpY2ggaXMgc2Vuc2l0aXZlIHRvIGJvdGggdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSBvZiB0aGUgdmFyaWFibGVzIGFuZCB0aGUgY29ycmVsYXRpb24gYW1vbmdzdCB2YXJpYWJsZXM6IA0KDQokJA0Kd19qIFxwcm9wdG8gKHdfal5hIFxjZG90IHdfal5iKQ0KJCQNCg0KSG93ZXZlciwgaXQgbXVzdCBiZSBub3RlZCB0aGF0IHdoaWxzdCB0aGUgc2NvcmVzIHRoZW1zZWx2ZXMgY2FuIGJlIHNoYXJlZCBhbmQgdXNlZCwgcmVwbGljYXRpbmcgYWxsIHRoZSBjYWxjdWxhdGlvbnMgd2lsbCBuZWNlc3NpdGF0ZSBvYnRhaW5pbmcgcGVybWlzc2lvbiBmcm9tIFtVTkhDUl0obWFpbHRvOjxOaWkgQWtvIFNvd2E+c293YW5paUB1bmhjci5vcmc/Y2M9bXlheWFpbUB1bmhjci5vcmcmc3ViamVjdD1NeWFubWFyJTIwSURQJTIwZGF0YSkgYXMgdGhlaXIgdG93bnNoaXAtbGV2ZWwgYnJlYWtkb3duIG9mIElEUCBwb3B1bGF0aW9ucyBoYXZlIG5vdCBiZWVuIHNoYXJlZCBwdWJsaWNseS4gVGhlIHNwZWNpZmljIGNvZGUgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb25mbGljdCBzY29yZSBjYW4gYmUgZm91bmQgYmVsb3cuIA0KDQo8YnI+DQoNCmBgYHtyIGV2YWw9RkFMU0UsIGVjaG89VFJVRX0NCg0KIyBCZXR0aS1WZXJtYSBjYWxjdWxhdGlvbnMgYW5kIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIGNvbmZsaWN0IHNjb3JlDQppbmRleF9zaGFyZXMyIDwtIGNvbmZsaWN0X2RmMiAlPiUgICANCiAgbXV0YXRlX2F0KHZhcnMoYyhiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIA0KICAgICAgICAgICAgICAgICAgIGZhdGFsaXRpZXMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIA0KICAgICAgICAgICAgICAgICAgIHByb3Rlc3RzX2FuZF9yaW90cywgdG90YWxfaWRwcykpLCANCiAgICAgICAgICAgc2NhbGUpICU+JSAgDQogIG11dGF0ZV9hdCh2YXJzKGMoYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCANCiAgICAgICAgICAgICAgICAgICBmYXRhbGl0aWVzLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCANCiAgICAgICAgICAgICAgICAgICBwcm90ZXN0c19hbmRfcmlvdHMsIHRvdGFsX2lkcHMpKSwgDQogICAgICAgICAgIGZ1bnMoKC4gLSBtaW4oLiwgbmEucm0gPSBUKSkvKG1heCguLCBuYS5ybSA9IFQpIC0gbWluKC4sIG5hLnJtID0gVCkpKSkgJT4lIA0KICBtZGVwcml2KGMoImJhdHRsZXMiLCAiZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UiLCANCiAgICAgICAgICAgICJ2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyIsICJmYXRhbGl0aWVzIiwgDQogICAgICAgICAgICAic3RyYXRlZ2ljX2RldmVsb3BtZW50cyIsICJwcm90ZXN0c19hbmRfcmlvdHMiLCAidG90YWxfaWRwcyIpLA0KICAgICAgICAgICMgSURQIGNvdW50cyBoYXZlIGJlZW4gdXNlZCBpbiB0aGUgc2NvcmUsIGJ1dCB3aWxsIG5vdCBiZSByZWFkIA0KICAgICAgICAgICMgaW50byB0aGlzIHJlcG9ydA0KICAgICAgICAgIG1ldGhvZCA9ICJidiIsIG91dHB1dCA9ICJhbGwiKQ0KDQpgYGANCg0K